|
@@ -5173,7 +5173,14 @@ void RasterizerStorageGLES2::_render_target_clear(RenderTarget *rt) {
|
|
texture_owner.free(rt->external.texture);
|
|
texture_owner.free(rt->external.texture);
|
|
memdelete(t);
|
|
memdelete(t);
|
|
|
|
|
|
|
|
+ if (rt->external.depth != 0 && rt->external.depth_owned) {
|
|
|
|
+ glDeleteRenderbuffers(1, &rt->external.depth);
|
|
|
|
+ }
|
|
|
|
+
|
|
rt->external.fbo = 0;
|
|
rt->external.fbo = 0;
|
|
|
|
+ rt->external.color = 0;
|
|
|
|
+ rt->external.depth = 0;
|
|
|
|
+ rt->external.depth_owned = false;
|
|
}
|
|
}
|
|
|
|
|
|
if (rt->depth) {
|
|
if (rt->depth) {
|
|
@@ -5298,7 +5305,19 @@ RID RasterizerStorageGLES2::render_target_get_texture(RID p_render_target) const
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-void RasterizerStorageGLES2::render_target_set_external_texture(RID p_render_target, unsigned int p_texture_id) {
|
|
|
|
|
|
+uint32_t RasterizerStorageGLES2::render_target_get_depth_texture_id(RID p_render_target) const {
|
|
|
|
+
|
|
|
|
+ RenderTarget *rt = render_target_owner.getornull(p_render_target);
|
|
|
|
+ ERR_FAIL_COND_V(!rt, 0);
|
|
|
|
+
|
|
|
|
+ if (rt->external.depth == 0) {
|
|
|
|
+ return rt->depth;
|
|
|
|
+ } else {
|
|
|
|
+ return rt->external.depth;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void RasterizerStorageGLES2::render_target_set_external_texture(RID p_render_target, unsigned int p_texture_id, unsigned int p_depth_id) {
|
|
RenderTarget *rt = render_target_owner.getornull(p_render_target);
|
|
RenderTarget *rt = render_target_owner.getornull(p_render_target);
|
|
ERR_FAIL_COND(!rt);
|
|
ERR_FAIL_COND(!rt);
|
|
|
|
|
|
@@ -5308,7 +5327,7 @@ void RasterizerStorageGLES2::render_target_set_external_texture(RID p_render_tar
|
|
glDeleteFramebuffers(1, &rt->external.fbo);
|
|
glDeleteFramebuffers(1, &rt->external.fbo);
|
|
|
|
|
|
// and this
|
|
// and this
|
|
- if (rt->external.depth != 0) {
|
|
|
|
|
|
+ if (rt->external.depth != 0 && rt->external.depth_owned) {
|
|
glDeleteRenderbuffers(1, &rt->external.depth);
|
|
glDeleteRenderbuffers(1, &rt->external.depth);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -5388,15 +5407,31 @@ void RasterizerStorageGLES2::render_target_set_external_texture(RID p_render_tar
|
|
// On any other hardware these two modes are ignored and we do not have any MSAA,
|
|
// On any other hardware these two modes are ignored and we do not have any MSAA,
|
|
// the normal MSAA modes need to be used to enable our two pass approach
|
|
// the normal MSAA modes need to be used to enable our two pass approach
|
|
|
|
|
|
|
|
+ // If we created a depth buffer before and we're now passed one, we need to clear it out
|
|
|
|
+ if (rt->external.depth != 0 && rt->external.depth_owned && p_depth_id != 0) {
|
|
|
|
+ glDeleteRenderbuffers(1, &rt->external.depth);
|
|
|
|
+ rt->external.depth_owned = false;
|
|
|
|
+ rt->external.depth = 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!rt->external.depth_owned) {
|
|
|
|
+ rt->external.depth = p_depth_id;
|
|
|
|
+ }
|
|
|
|
+
|
|
static const int msaa_value[] = { 2, 4 };
|
|
static const int msaa_value[] = { 2, 4 };
|
|
int msaa = msaa_value[rt->msaa - VS::VIEWPORT_MSAA_EXT_2X];
|
|
int msaa = msaa_value[rt->msaa - VS::VIEWPORT_MSAA_EXT_2X];
|
|
|
|
|
|
if (rt->external.depth == 0) {
|
|
if (rt->external.depth == 0) {
|
|
|
|
+ rt->external.depth_owned = true;
|
|
|
|
+
|
|
// create a multisample depth buffer, we're not reusing Godots because Godot's didn't get created..
|
|
// create a multisample depth buffer, we're not reusing Godots because Godot's didn't get created..
|
|
glGenRenderbuffers(1, &rt->external.depth);
|
|
glGenRenderbuffers(1, &rt->external.depth);
|
|
glBindRenderbuffer(GL_RENDERBUFFER, rt->external.depth);
|
|
glBindRenderbuffer(GL_RENDERBUFFER, rt->external.depth);
|
|
glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa, config.depth_buffer_internalformat, rt->width, rt->height);
|
|
glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa, config.depth_buffer_internalformat, rt->width, rt->height);
|
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rt->external.depth);
|
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rt->external.depth);
|
|
|
|
+ } else if (!rt->external.depth_owned) {
|
|
|
|
+ // we make an exception here, external plugin MUST make sure this is a proper multisample render buffer!
|
|
|
|
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rt->external.depth);
|
|
}
|
|
}
|
|
|
|
|
|
// and set our external texture as the texture...
|
|
// and set our external texture as the texture...
|
|
@@ -5405,11 +5440,20 @@ void RasterizerStorageGLES2::render_target_set_external_texture(RID p_render_tar
|
|
} else
|
|
} else
|
|
#endif
|
|
#endif
|
|
{
|
|
{
|
|
|
|
+ // if MSAA as on before, clear our render buffer
|
|
|
|
+ if (rt->external.depth != 0 && rt->external.depth_owned) {
|
|
|
|
+ glDeleteRenderbuffers(1, &rt->external.depth);
|
|
|
|
+ }
|
|
|
|
+ rt->external.depth_owned = false;
|
|
|
|
+ rt->external.depth = p_depth_id;
|
|
|
|
+
|
|
// set our texture as the destination for our framebuffer
|
|
// set our texture as the destination for our framebuffer
|
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, p_texture_id, 0);
|
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, p_texture_id, 0);
|
|
|
|
|
|
// seeing we're rendering into this directly, better also use our depth buffer, just use our existing one :)
|
|
// seeing we're rendering into this directly, better also use our depth buffer, just use our existing one :)
|
|
- if (config.support_depth_texture) {
|
|
|
|
|
|
+ if (rt->external.depth != 0) {
|
|
|
|
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, rt->external.depth, 0);
|
|
|
|
+ } else if (config.support_depth_texture) {
|
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, rt->depth, 0);
|
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, rt->depth, 0);
|
|
} else {
|
|
} else {
|
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rt->depth);
|
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rt->depth);
|