summaryrefslogtreecommitdiffstats
path: root/servers/visual/rasterizer/render_pipeline_vertex_format_cache_rd.cpp
diff options
context:
space:
mode:
authorJuan Linietsky <juan@godotengine.org>2019-06-19 17:03:19 -0300
committerJuan Linietsky <reduzio@gmail.com>2020-02-11 11:53:27 +0100
commit42b44f43ee52eb664d3610d0fdae0eff14c00f0a (patch)
tree3125054b1d86f9eb1b10dd760b12010c3d6a1e89 /servers/visual/rasterizer/render_pipeline_vertex_format_cache_rd.cpp
parent9b0dd4f571ff431e23b9097e7f29746f4157be12 (diff)
downloadredot-engine-42b44f43ee52eb664d3610d0fdae0eff14c00f0a.tar.gz
Basic 2D engine is more or less working, needs more work for editor to be usable.
Diffstat (limited to 'servers/visual/rasterizer/render_pipeline_vertex_format_cache_rd.cpp')
-rw-r--r--servers/visual/rasterizer/render_pipeline_vertex_format_cache_rd.cpp61
1 files changed, 61 insertions, 0 deletions
diff --git a/servers/visual/rasterizer/render_pipeline_vertex_format_cache_rd.cpp b/servers/visual/rasterizer/render_pipeline_vertex_format_cache_rd.cpp
new file mode 100644
index 0000000000..441c70cdcf
--- /dev/null
+++ b/servers/visual/rasterizer/render_pipeline_vertex_format_cache_rd.cpp
@@ -0,0 +1,61 @@
+#include "render_pipeline_vertex_format_cache_rd.h"
+#include "core/os/memory.h"
+
+RID RenderPipelineVertexFormatCacheRD::_generate_version(RD::VertexFormatID p_format_id, RenderingDevice::TextureSamples p_samples) {
+
+ RD::PipelineMultisampleState multisample_state_version;
+ if (p_samples != RD::TEXTURE_SAMPLES_1) {
+ multisample_state_version = multisample_state;
+ multisample_state_version.sample_count = p_samples;
+ }
+ RID pipeline = RD::get_singleton()->render_pipeline_create(shader, framebuffer_format, p_format_id, render_primitive, rasterization_state, multisample_state, depth_stencil_state, blend_state, dynamic_state_flags);
+ ERR_FAIL_COND_V(pipeline.is_null(), RID());
+ versions[p_samples] = (Version *)memrealloc(versions[p_samples], sizeof(Version) * (version_count[p_samples] + 1));
+ versions[p_samples][version_count[p_samples]].format_id = p_format_id;
+ versions[p_samples][version_count[p_samples]].pipeline = pipeline;
+ version_count[p_samples]++;
+ return pipeline;
+}
+
+void RenderPipelineVertexFormatCacheRD::_clear() {
+
+ for (int v = 0; v < RD::TEXTURE_SAMPLES_MAX; v++) {
+ if (versions[v]) {
+ for (uint32_t i = 0; i < version_count[v]; i++) {
+ RD::get_singleton()->free(versions[v][i].pipeline);
+ }
+ version_count[v] = 0;
+ memfree(versions[v]);
+ versions[v] = NULL;
+ }
+ }
+}
+
+void RenderPipelineVertexFormatCacheRD::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) {
+ ERR_FAIL_COND(p_shader.is_null());
+ shader = p_shader;
+ framebuffer_format = p_framebuffer_format;
+ render_primitive = p_primitive;
+ rasterization_state = p_rasterization_state;
+ multisample_state = p_multisample;
+ depth_stencil_state = p_depth_stencil_state;
+ blend_state = p_blend_state;
+ dynamic_state_flags = p_dynamic_state_flags;
+}
+
+void RenderPipelineVertexFormatCacheRD::update_shader(RID p_shader) {
+ ERR_FAIL_COND(p_shader.is_null());
+ _clear();
+ setup(p_shader, framebuffer_format, render_primitive, rasterization_state, multisample_state, depth_stencil_state, blend_state, dynamic_state_flags);
+}
+
+RenderPipelineVertexFormatCacheRD::RenderPipelineVertexFormatCacheRD() {
+ for (int i = 0; i < RD::TEXTURE_SAMPLES_MAX; i++) {
+ version_count[i] = 0;
+ versions[i] = NULL;
+ }
+}
+
+RenderPipelineVertexFormatCacheRD::~RenderPipelineVertexFormatCacheRD() {
+ _clear();
+}