X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsoftpipe%2Fsp_state_shader.c;h=1e64431344b7137dddc4cfe72bed495cdd559c40;hb=18ef8f83b2586de037df7e578d88cbfb6e764012;hp=da895270aa97b398b1ad248b455a9e71d0b8fa30;hpb=f8e6d19f3f40931be741b44d3edf210c38e13f0f;p=mesa.git diff --git a/src/gallium/drivers/softpipe/sp_state_shader.c b/src/gallium/drivers/softpipe/sp_state_shader.c index da895270aa9..1e64431344b 100644 --- a/src/gallium/drivers/softpipe/sp_state_shader.c +++ b/src/gallium/drivers/softpipe/sp_state_shader.c @@ -55,18 +55,17 @@ create_fs_variant(struct softpipe_context *softpipe, struct pipe_shader_state *stipple_fs = NULL, *curfs = &fs->shader; unsigned unit = 0; +#if DO_PSTIPPLE_IN_HELPER_MODULE if (key->polygon_stipple) { /* get new shader that implements polygon stippling */ stipple_fs = util_pstipple_create_fragment_shader(&softpipe->pipe, curfs, &unit); curfs = stipple_fs; } +#endif /* codegen, create variant object */ - var = softpipe_create_fs_variant_sse(softpipe, curfs); - if (!var) { - var = softpipe_create_fs_variant_exec(softpipe, curfs); - } + var = softpipe_create_fs_variant_exec(softpipe, curfs); if (var) { var->key = *key; @@ -93,8 +92,8 @@ create_fs_variant(struct softpipe_context *softpipe, } if (stipple_fs) { - free((void *) stipple_fs->tokens); - free(stipple_fs); + FREE((void *) stipple_fs->tokens); + FREE(stipple_fs); } return var; @@ -159,8 +158,10 @@ softpipe_bind_fs_state(struct pipe_context *pipe, void *fs) softpipe->fs = fs; - if (fs == NULL) - softpipe->fs_variant = NULL; + /* This depends on the current fragment shader and must always be + * re-validated before use. + */ + softpipe->fs_variant = NULL; if (state) draw_bind_fragment_shader(softpipe->draw, @@ -205,6 +206,7 @@ softpipe_delete_fs_state(struct pipe_context *pipe, void *fs) draw_delete_fragment_shader(softpipe->draw, state->draw_shader); FREE((void *) state->shader.tokens); + FREE(state); } @@ -333,6 +335,8 @@ softpipe_delete_gs_state(struct pipe_context *pipe, void *gs) draw_delete_geometry_shader(softpipe->draw, (state) ? state->draw_data : 0); + + FREE((void *) state->shader.tokens); FREE(state); } @@ -340,11 +344,22 @@ softpipe_delete_gs_state(struct pipe_context *pipe, void *gs) static void softpipe_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index, - struct pipe_resource *constants) + struct pipe_constant_buffer *cb) { struct softpipe_context *softpipe = softpipe_context(pipe); - unsigned size = constants ? constants->width0 : 0; - const void *data = constants ? softpipe_resource(constants)->data : NULL; + struct pipe_resource *constants = cb ? cb->buffer : NULL; + unsigned size; + const void *data; + + if (cb && cb->user_buffer) { + constants = softpipe_user_buffer_create(pipe->screen, + (void *) cb->user_buffer, + cb->buffer_size, + PIPE_BIND_CONSTANT_BUFFER); + } + + size = constants ? constants->width0 : 0; + data = constants ? softpipe_resource(constants)->data : NULL; assert(shader < PIPE_SHADER_TYPES); @@ -361,6 +376,10 @@ softpipe_set_constant_buffer(struct pipe_context *pipe, softpipe->const_buffer_size[shader][index] = size; softpipe->dirty |= SP_NEW_CONSTANTS; + + if (cb && cb->user_buffer) { + pipe_resource_reference(&constants, NULL); + } }