48 lines
1.4 KiB
C++
48 lines
1.4 KiB
C++
#ifndef RENDER_PIPELINE_CACHE_RD_H
|
|
#define RENDER_PIPELINE_CACHE_RD_H
|
|
|
|
#include "servers/visual/rendering_device.h"
|
|
|
|
class RenderPipelineCacheRD {
|
|
|
|
RID shader;
|
|
|
|
RD::FramebufferFormatID framebuffer_format;
|
|
RD::RenderPrimitive render_primitive;
|
|
RD::PipelineRasterizationState rasterization_state;
|
|
RD::PipelineMultisampleState multisample_state;
|
|
RD::PipelineDepthStencilState depth_stencil_state;
|
|
RD::PipelineColorBlendState blend_state;
|
|
int dynamic_state_flags;
|
|
|
|
struct Version {
|
|
RD::VertexFormatID format_id;
|
|
RID pipeline;
|
|
};
|
|
|
|
Version *versions;
|
|
uint32_t version_count;
|
|
|
|
RID _generate_version(RD::VertexFormatID p_format_id);
|
|
|
|
void _clear();
|
|
|
|
public:
|
|
void setup(RID p_shader, RD::FramebufferFormatID p_framebuffer_format, RD::RenderPrimitive p_primitive, const RD::PipelineRasterizationState &p_rasterization_state, RD::PipelineMultisampleState p_multisample, const RD::PipelineDepthStencilState &p_depth_stencil_state, const RD::PipelineColorBlendState &p_blend_state, int p_dynamic_state_flags = 0);
|
|
void update_shader(RID p_shader);
|
|
|
|
_FORCE_INLINE_ RID get_render_pipeline(RD::VertexFormatID p_format_id) {
|
|
for (uint32_t i = 0; i < version_count; i++) {
|
|
if (versions[i].format_id == p_format_id) {
|
|
return versions[i].pipeline;
|
|
}
|
|
}
|
|
return _generate_version(p_format_id);
|
|
}
|
|
|
|
RenderPipelineCacheRD();
|
|
~RenderPipelineCacheRD();
|
|
};
|
|
|
|
#endif // RENDER_PIPELINE_CACHE_RD_H
|