swr: Update screen->context pointer with multiple contexts.
A pipe pointer in the screen allows for access to current device context in flush_frontbuffer and resource_destroy. This wasn't tracking current context in multi-context situations. v2: More caffeine. Corrected compare, removed unnecessary set of screen-pipe in create_context, and added a few comments.
This commit is contained in:
parent
ace3124f22
commit
6b0ac95c28
|
@ -322,8 +322,10 @@ swr_destroy(struct pipe_context *pipe)
|
|||
|
||||
swr_destroy_scratch_buffers(ctx);
|
||||
|
||||
/* Only update screen->pipe if current context is being destroyed */
|
||||
assert(screen);
|
||||
screen->pipe = NULL;
|
||||
if (screen->pipe == pipe)
|
||||
screen->pipe = NULL;
|
||||
|
||||
FREE(ctx);
|
||||
}
|
||||
|
@ -346,7 +348,6 @@ struct pipe_context *
|
|||
swr_create_context(struct pipe_screen *p_screen, void *priv, unsigned flags)
|
||||
{
|
||||
struct swr_context *ctx = CALLOC_STRUCT(swr_context);
|
||||
struct swr_screen *screen = swr_screen(p_screen);
|
||||
ctx->blendJIT =
|
||||
new std::unordered_map<BLEND_COMPILE_STATE, PFN_BLEND_JIT_FUNC>;
|
||||
|
||||
|
@ -366,7 +367,6 @@ swr_create_context(struct pipe_screen *p_screen, void *priv, unsigned flags)
|
|||
if (ctx->swrContext == NULL)
|
||||
goto fail;
|
||||
|
||||
screen->pipe = &ctx->pipe;
|
||||
ctx->pipe.screen = p_screen;
|
||||
ctx->pipe.destroy = swr_destroy;
|
||||
ctx->pipe.priv = priv;
|
||||
|
|
|
@ -776,6 +776,10 @@ swr_update_derived(struct pipe_context *pipe,
|
|||
struct swr_context *ctx = swr_context(pipe);
|
||||
struct swr_screen *screen = swr_screen(ctx->pipe.screen);
|
||||
|
||||
/* Update screen->pipe to current pipe context. */
|
||||
if (screen->pipe != pipe)
|
||||
screen->pipe = pipe;
|
||||
|
||||
/* Any state that requires dirty flags to be re-triggered sets this mask */
|
||||
/* For example, user_buffer vertex and index buffers. */
|
||||
unsigned post_update_dirty_flags = 0;
|
||||
|
|
Loading…
Reference in New Issue