glthread: track GL_READ_FRAMEBUFFER bindings too

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17976>
This commit is contained in:
Marek Olšák
2022-08-09 19:45:08 -04:00
committed by Marge Bot
parent 28e351673e
commit f9b0dc9377
4 changed files with 26 additions and 5 deletions

View File

@@ -203,7 +203,7 @@
</function> </function>
<function name="BindFramebuffer" es2="2.0" <function name="BindFramebuffer" es2="2.0"
marshal_call_after="if (target == GL_FRAMEBUFFER || target == GL_DRAW_FRAMEBUFFER) ctx->GLThread.CurrentDrawFramebuffer = framebuffer;"> marshal_call_after="_mesa_glthread_BindFramebuffer(ctx, target, framebuffer);">
<param name="target" type="GLenum"/> <param name="target" type="GLenum"/>
<param name="framebuffer" type="GLuint"/> <param name="framebuffer" type="GLuint"/>
<glx rop="236"/> <glx rop="236"/>

View File

@@ -236,6 +236,7 @@ struct glthread_state
bool CullFace; bool CullFace;
GLuint CurrentDrawFramebuffer; GLuint CurrentDrawFramebuffer;
GLuint CurrentReadFramebuffer;
GLuint CurrentProgram; GLuint CurrentProgram;
}; };

View File

@@ -65,9 +65,12 @@ _mesa_marshal_GetIntegerv(GLenum pname, GLint *p)
case GL_DRAW_INDIRECT_BUFFER_BINDING: case GL_DRAW_INDIRECT_BUFFER_BINDING:
*p = ctx->GLThread.CurrentDrawIndirectBufferName; *p = ctx->GLThread.CurrentDrawIndirectBufferName;
return; return;
case GL_DRAW_FRAMEBUFFER_BINDING: /* == GL_FRAMEBUFFER_BINDING */ case GL_DRAW_FRAMEBUFFER_BINDING:
*p = ctx->GLThread.CurrentDrawFramebuffer; *p = ctx->GLThread.CurrentDrawFramebuffer;
return; return;
case GL_READ_FRAMEBUFFER_BINDING:
*p = ctx->GLThread.CurrentReadFramebuffer;
return;
case GL_PIXEL_PACK_BUFFER_BINDING: case GL_PIXEL_PACK_BUFFER_BINDING:
*p = ctx->GLThread.CurrentPixelPackBufferName; *p = ctx->GLThread.CurrentPixelPackBufferName;
return; return;

View File

@@ -779,16 +779,33 @@ _mesa_glthread_DeleteLists(struct gl_context *ctx, GLsizei range)
_mesa_glthread_flush_batch(ctx); _mesa_glthread_flush_batch(ctx);
} }
static inline void
_mesa_glthread_BindFramebuffer(struct gl_context *ctx, GLenum target, GLuint id)
{
switch (target) {
case GL_FRAMEBUFFER:
ctx->GLThread.CurrentDrawFramebuffer = id;
ctx->GLThread.CurrentReadFramebuffer = id;
break;
case GL_DRAW_FRAMEBUFFER:
ctx->GLThread.CurrentDrawFramebuffer = id;
break;
case GL_READ_FRAMEBUFFER:
ctx->GLThread.CurrentReadFramebuffer = id;
break;
}
}
static inline void static inline void
_mesa_glthread_DeleteFramebuffers(struct gl_context *ctx, GLsizei n, _mesa_glthread_DeleteFramebuffers(struct gl_context *ctx, GLsizei n,
const GLuint *ids) const GLuint *ids)
{ {
if (ctx->GLThread.CurrentDrawFramebuffer) { if (ctx->GLThread.CurrentDrawFramebuffer) {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
if (ctx->GLThread.CurrentDrawFramebuffer == ids[i]) { if (ctx->GLThread.CurrentDrawFramebuffer == ids[i])
ctx->GLThread.CurrentDrawFramebuffer = 0; ctx->GLThread.CurrentDrawFramebuffer = 0;
break; if (ctx->GLThread.CurrentReadFramebuffer == ids[i])
} ctx->GLThread.CurrentReadFramebuffer = 0;
} }
} }
} }