Skip to content

Commit 25e8e17

Browse files
committed
Add clear and blend state arguments
1 parent 286f0f8 commit 25e8e17

File tree

9 files changed

+77
-13
lines changed

9 files changed

+77
-13
lines changed

doc/classes/RenderingServer.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2437,6 +2437,8 @@
24372437
<param index="0" name="mesh_rasterizer" type="RID" />
24382438
<param index="1" name="material" type="RID" />
24392439
<param index="2" name="bg_color" type="Color" />
2440+
<param index="3" name="clear" type="bool" default="true" />
2441+
<param index="4" name="blend_state" type="RDPipelineColorBlendState" default="null" />
24402442
<description>
24412443
</description>
24422444
</method>

servers/rendering/dummy/mesh_rasterizer_dummy.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class MeshRasterizerDummy : public MeshRasterizer {
3939
virtual RID mesh_rasterizer_allocate() override { return RID(); }
4040
virtual void mesh_rasterizer_initialize(RID p_mesh_rasterizer, int p_width, int p_height, RS::RasterizedTextureFormat p_texture_format, bool p_generate_mipmaps, RD::TextureSamples p_samples) override {}
4141
virtual void mesh_rasterizer_set_mesh(RID p_mesh_rasterizer, RID p_mesh, int p_surface_index) override {}
42-
virtual void mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_material, const Color &p_bg_color) override {}
42+
virtual void mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_material, const Color &p_bg_color, bool p_clear = true, const Ref<RDPipelineColorBlendState> &p_blend_state = Ref<RDPipelineColorBlendState>()) override {}
4343
virtual RID mesh_rasterizer_get_texture(RID p_mesh_rasterizer) override { return RID(); }
4444
virtual bool free(RID p_mesh_rasterizer) override { return true; }
4545
};

servers/rendering/mesh_rasterizer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class MeshRasterizer {
4040
virtual RID mesh_rasterizer_allocate() = 0;
4141
virtual void mesh_rasterizer_initialize(RID p_mesh_rasterizer, int p_width, int p_height, RS::RasterizedTextureFormat p_texture_format, bool p_generate_mipmaps, RD::TextureSamples p_samples) = 0;
4242
virtual void mesh_rasterizer_set_mesh(RID p_mesh_rasterizer, RID p_mesh, int p_surface_index) = 0;
43-
virtual void mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_material, const Color &p_bg_color) = 0;
43+
virtual void mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_material, const Color &p_bg_color, bool p_clear = true, const Ref<RDPipelineColorBlendState> &p_blend_state = Ref<RDPipelineColorBlendState>()) = 0;
4444
virtual RID mesh_rasterizer_get_texture(RID p_mesh_rasterizer) = 0;
4545
virtual bool free(RID p_mesh_rasterizer) = 0;
4646

servers/rendering/renderer_rd/mesh_rasterizer_rd.cpp

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ void MeshRasterizerRD::mesh_rasterizer_set_mesh(RID p_mesh_rasterizer, RID p_mes
148148
}
149149
}
150150

151-
void MeshRasterizerRD::mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_material, const Color &p_bg_color) {
151+
void MeshRasterizerRD::mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_material, const Color &p_bg_color, bool p_clear, const Ref<RDPipelineColorBlendState> &p_blend_state) {
152152
MeshRasterizerData *mesh_rasterizer = mesh_rasterizer_owner.get_or_null(p_mesh_rasterizer);
153153
ERR_FAIL_COND(p_material.is_null());
154154
MaterialStorage *material_storage = MaterialStorage::get_singleton();
@@ -180,8 +180,38 @@ void MeshRasterizerRD::mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_materia
180180
pipline_multisample_state.sample_count = mesh_rasterizer->samples;
181181
RD::FramebufferFormatID fb_fmt = RD::get_singleton()->framebuffer_get_format(mesh_rasterizer->framebuffer_rid);
182182

183+
RD::PipelineColorBlendState blend_state;
184+
blend_state.attachments.push_back({});
185+
186+
if (p_blend_state.is_valid()) {
187+
blend_state.blend_constant = p_blend_state->get_blend_constant();
188+
blend_state.enable_logic_op = p_blend_state->get_enable_logic_op();
189+
blend_state.logic_op = p_blend_state->get_logic_op();
190+
TypedArray<Ref<RDPipelineColorBlendStateAttachment>> attachments = p_blend_state->get_attachments();
191+
if (attachments.size() >= 1) {
192+
Ref<RDPipelineColorBlendStateAttachment> attachment = attachments[0];
193+
if (attachment.is_valid()) {
194+
blend_state.attachments.write[0].enable_blend = attachment->get_enable_blend();
195+
blend_state.attachments.write[0].src_color_blend_factor = attachment->get_src_color_blend_factor();
196+
blend_state.attachments.write[0].dst_color_blend_factor = attachment->get_dst_color_blend_factor();
197+
blend_state.attachments.write[0].color_blend_op = attachment->get_color_blend_op();
198+
blend_state.attachments.write[0].src_alpha_blend_factor = attachment->get_src_alpha_blend_factor();
199+
blend_state.attachments.write[0].dst_alpha_blend_factor = attachment->get_dst_alpha_blend_factor();
200+
blend_state.attachments.write[0].alpha_blend_op = attachment->get_alpha_blend_op();
201+
blend_state.attachments.write[0].write_r = attachment->get_write_r();
202+
blend_state.attachments.write[0].write_g = attachment->get_write_g();
203+
blend_state.attachments.write[0].write_b = attachment->get_write_b();
204+
blend_state.attachments.write[0].write_a = attachment->get_write_a();
205+
}
206+
}
207+
}
208+
183209
PipelineCacheKey k = {
184-
shader_data->shader_rd.get_id(), fb_fmt, mesh_rasterizer->primitive, mesh_rasterizer->samples
210+
shader_data->shader_rd.get_id(),
211+
fb_fmt,
212+
mesh_rasterizer->primitive,
213+
mesh_rasterizer->samples,
214+
blend_state
185215
};
186216

187217
if (mesh_rasterizer->pipeline_cache.first == k) {
@@ -190,12 +220,14 @@ void MeshRasterizerRD::mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_materia
190220
if (RD::get_singleton()->render_pipeline_is_valid(mesh_rasterizer->pipeline_cache.second)) {
191221
RD::get_singleton()->free(mesh_rasterizer->pipeline_cache.second);
192222
}
193-
pipeline = RD::get_singleton()->render_pipeline_create(shader_data->shader_rd, fb_fmt, singleton->vertex_format, mesh_rasterizer->primitive, pipeline_rasterization_state, pipline_multisample_state, {}, singleton->pipeline_color_blend_state);
223+
224+
pipeline = RD::get_singleton()->render_pipeline_create(shader_data->shader_rd, fb_fmt, singleton->vertex_format, mesh_rasterizer->primitive, pipeline_rasterization_state, pipline_multisample_state, {}, blend_state);
225+
194226
mesh_rasterizer->pipeline_cache = { k, pipeline };
195227
}
196228

197229
LocalVector<Color> clear_colors = { p_bg_color };
198-
RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(mesh_rasterizer->framebuffer_rid, RD::DrawFlags::DRAW_CLEAR_ALL, clear_colors);
230+
RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(mesh_rasterizer->framebuffer_rid, p_clear ? RD::DRAW_CLEAR_ALL : RD::DRAW_DEFAULT_ALL, clear_colors);
199231
RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, pipeline);
200232

201233
// Vertex
@@ -502,8 +534,6 @@ MeshRasterizerRD::MeshRasterizerRD() {
502534

503535
vertex_format = RD::get_singleton()->vertex_format_create(vertex_attrs);
504536

505-
pipeline_color_blend_state.attachments.append({});
506-
507537
RD::FramebufferPass pass;
508538
pass.resolve_attachments.append(0);
509539
pass.color_attachments.append(1);

servers/rendering/renderer_rd/mesh_rasterizer_rd.h

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,30 @@ class MeshRasterizerRD : public MeshRasterizer {
7979
RD::FramebufferFormatID framebuffer_formt;
8080
RD::RenderPrimitive primitive;
8181
RD::TextureSamples samples;
82+
RD::PipelineColorBlendState blend_state;
8283

8384
bool operator==(const PipelineCacheKey &b) const {
85+
Vector<RD::PipelineColorBlendState::Attachment> attachments = b.blend_state.attachments;
86+
RD::PipelineColorBlendState::Attachment attachment = attachments[0];
87+
bool eq = true;
88+
eq = eq && blend_state.blend_constant == b.blend_state.blend_constant;
89+
eq = eq && blend_state.enable_logic_op == b.blend_state.enable_logic_op;
90+
eq = eq && blend_state.logic_op == b.blend_state.logic_op;
91+
eq = eq && blend_state.attachments[0].enable_blend == attachment.enable_blend;
92+
eq = eq && blend_state.attachments[0].src_color_blend_factor == attachment.src_color_blend_factor;
93+
eq = eq && blend_state.attachments[0].dst_color_blend_factor == attachment.dst_color_blend_factor;
94+
eq = eq && blend_state.attachments[0].color_blend_op == attachment.color_blend_op;
95+
eq = eq && blend_state.attachments[0].src_alpha_blend_factor == attachment.src_alpha_blend_factor;
96+
eq = eq && blend_state.attachments[0].dst_alpha_blend_factor == attachment.dst_alpha_blend_factor;
97+
eq = eq && blend_state.attachments[0].alpha_blend_op == attachment.alpha_blend_op;
98+
eq = eq && blend_state.attachments[0].write_r == attachment.write_r;
99+
eq = eq && blend_state.attachments[0].write_g == attachment.write_g;
100+
eq = eq && blend_state.attachments[0].write_b == attachment.write_b;
101+
eq = eq && blend_state.attachments[0].write_a == attachment.write_a;
102+
if (!eq) {
103+
return false;
104+
}
105+
84106
if (shader_id != b.shader_id) {
85107
return false;
86108
} else if (framebuffer_formt != b.framebuffer_formt) {
@@ -130,7 +152,6 @@ class MeshRasterizerRD : public MeshRasterizer {
130152
};
131153

132154
RD::VertexFormatID vertex_format;
133-
RD::PipelineColorBlendState pipeline_color_blend_state;
134155
Vector<RD::FramebufferPass> render_passes;
135156
MeshRasterizerShaderRD shader_file_rd;
136157
ShaderCompiler compiler;
@@ -143,7 +164,7 @@ class MeshRasterizerRD : public MeshRasterizer {
143164
RID mesh_rasterizer_allocate();
144165
void mesh_rasterizer_initialize(RID p_mesh_rasterizer, int p_width, int p_height, RS::RasterizedTextureFormat p_texture_format, bool p_generate_mipmaps, RD::TextureSamples p_samples);
145166
void mesh_rasterizer_set_mesh(RID p_mesh_rasterizer, RID p_mesh, int p_surface_index);
146-
void mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_material, const Color &p_bg_color);
167+
void mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_material, const Color &p_bg_color, bool p_clear = true, const Ref<RDPipelineColorBlendState> &p_blend_state = Ref<RDPipelineColorBlendState>());
147168
RID mesh_rasterizer_get_texture(RID p_mesh_rasterizer);
148169
bool free(RID p_mesh_rasterizer);
149170

servers/rendering/rendering_server_default.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,16 @@ void RenderingServerDefault::_call_on_render_thread(const Callable &p_callable)
433433
p_callable.call();
434434
}
435435

436+
void RenderingServerDefault::mesh_rasterizer_draw(RID p1, RID p2, const Color &p3, bool p4, const Ref<RDPipelineColorBlendState> &p5) {
437+
redraw_request();
438+
if (Thread ::get_caller_id() != server_thread) {
439+
command_queue.push(RenderingServerGlobals ::mesh_rasterizer, &MeshRasterizer ::mesh_rasterizer_draw, p1, p2, p3, p4, p5);
440+
} else {
441+
command_queue.flush_if_pending();
442+
RenderingServerGlobals ::mesh_rasterizer->mesh_rasterizer_draw(p1, p2, p3, p4, p5);
443+
}
444+
}
445+
436446
RenderingServerDefault::RenderingServerDefault(bool p_create_thread) {
437447
RenderingServer::init();
438448

servers/rendering/rendering_server_default.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1102,7 +1102,7 @@ class RenderingServerDefault : public RenderingServer {
11021102

11031103
FUNCRIDSPLIT5(mesh_rasterizer, int, int, RasterizedTextureFormat, bool, RD::TextureSamples);
11041104
FUNC3(mesh_rasterizer_set_mesh, RID, RID, int);
1105-
FUNC3(mesh_rasterizer_draw, RID, RID, const Color &);
1105+
virtual void mesh_rasterizer_draw(RID p1, RID p2, const Color &p3, bool p4, const Ref<RDPipelineColorBlendState> &p5) override;
11061106
FUNC1R(RID, mesh_rasterizer_get_texture, RID);
11071107

11081108
/* STATUS INFORMATION */

servers/rendering_server.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
#include "core/config/project_settings.h"
3535
#include "core/variant/typed_array.h"
36+
#include "servers/rendering/rendering_device_binds.h"
3637
#include "servers/rendering/shader_language.h"
3738
#include "servers/rendering/shader_warnings.h"
3839

@@ -2480,7 +2481,7 @@ void RenderingServer::_bind_methods() {
24802481

24812482
ClassDB::bind_method(D_METHOD("mesh_rasterizer_create", "width", "height", "texture_format", "generate_mipmaps", "samples"), &RenderingServer::mesh_rasterizer_create, DEFVAL(false), DEFVAL(RD::TEXTURE_SAMPLES_1));
24822483
ClassDB::bind_method(D_METHOD("mesh_rasterizer_set_mesh", "mesh_rasterizer", "mesh", "surface_index"), &RenderingServer::mesh_rasterizer_set_mesh);
2483-
ClassDB::bind_method(D_METHOD("mesh_rasterizer_draw", "mesh_rasterizer", "material", "bg_color"), &RenderingServer::mesh_rasterizer_draw);
2484+
ClassDB::bind_method(D_METHOD("mesh_rasterizer_draw", "mesh_rasterizer", "material", "bg_color", "clear", "blend_state"), &RenderingServer::mesh_rasterizer_draw, DEFVAL(true), DEFVAL(Ref<RDPipelineColorBlendState>()));
24842485
ClassDB::bind_method(D_METHOD("mesh_rasterizer_get_texture", "mesh_rasterizer"), &RenderingServer::mesh_rasterizer_get_texture);
24852486

24862487
/* SKELETON API */

servers/rendering_server.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1180,7 +1180,7 @@ class RenderingServer : public Object {
11801180
};
11811181
virtual RID mesh_rasterizer_create(int p_width, int p_height, RasterizedTextureFormat p_texture_format, bool p_generate_mipmaps = false, RD::TextureSamples p_samples = RD::TEXTURE_SAMPLES_1) = 0;
11821182
virtual void mesh_rasterizer_set_mesh(RID p_mesh_rasterizer, RID p_mesh, int p_surface_index) = 0;
1183-
virtual void mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_material, const Color &p_bg_color) = 0;
1183+
virtual void mesh_rasterizer_draw(RID p_mesh_rasterizer, RID p_material, const Color &p_bg_color, bool p_clear = true, const Ref<RDPipelineColorBlendState> &p_blend_state = Ref<RDPipelineColorBlendState>()) = 0;
11841184
virtual RID mesh_rasterizer_get_texture(RID p_mesh_rasterizer) = 0;
11851185

11861186
/* SKY API */

0 commit comments

Comments
 (0)