diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c index 8d0d343fbaf..f2667ffced3 100644 --- a/src/mesa/state_tracker/st_atom_texture.c +++ b/src/mesa/state_tracker/st_atom_texture.c @@ -319,10 +319,8 @@ st_update_fragment_textures(struct st_context *st) { const struct gl_context *ctx = st->ctx; - update_textures(st, - PIPE_SHADER_FRAGMENT, - ctx->FragmentProgram._Current, - st->state.frag_sampler_views); + update_textures_local(st, PIPE_SHADER_FRAGMENT, + ctx->FragmentProgram._Current); } diff --git a/src/mesa/state_tracker/st_cb_bitmap.c b/src/mesa/state_tracker/st_cb_bitmap.c index ffa6dcb3f07..b3f48ba2b91 100644 --- a/src/mesa/state_tracker/st_cb_bitmap.c +++ b/src/mesa/state_tracker/st_cb_bitmap.c @@ -241,16 +241,19 @@ setup_render_state(struct gl_context *ctx, /* user textures, plus the bitmap texture */ { - struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS]; - uint num = MAX2(fpv->bitmap_sampler + 1, - st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]); - memcpy(sampler_views, st->state.frag_sampler_views, - sizeof(sampler_views)); + struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS] = {}; + unsigned num_views = + st_get_sampler_views(st, PIPE_SHADER_FRAGMENT, + ctx->FragmentProgram._Current, sampler_views); + + num_views = MAX2(fpv->bitmap_sampler + 1, num_views); sampler_views[fpv->bitmap_sampler] = sv; - pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num, 0, + pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num_views, 0, sampler_views); - st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = - MAX2(st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], num); + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = num_views; + + for (unsigned i = 0; i < num_views; i++) + pipe_sampler_view_reference(&sampler_views[i], NULL); } /* viewport state: viewport matching window dims */ @@ -456,8 +459,6 @@ st_flush_bitmap_cache(struct st_context *st) BITMAP_CACHE_WIDTH, BITMAP_CACHE_HEIGHT, sv, cache->color); - - pipe_sampler_view_reference(&sv, NULL); } /* release/free the texture */ @@ -643,8 +644,6 @@ st_Bitmap(struct gl_context *ctx, GLint x, GLint y, if (sv) { draw_bitmap_quad(ctx, x, y, ctx->Current.RasterPos[2], width, height, sv, ctx->Current.RasterColor); - - pipe_sampler_view_reference(&sv, NULL); } /* release/free the texture */ @@ -785,8 +784,6 @@ out: pipe_resource_reference(&vb.buffer.resource, NULL); - pipe_sampler_view_reference(&sv, NULL); - /* We uploaded modified constants, need to invalidate them. */ st->dirty |= ST_NEW_FS_CONSTANTS; } diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c index 62ee6ad2a7e..49478bf368d 100644 --- a/src/mesa/state_tracker/st_cb_drawpixels.c +++ b/src/mesa/state_tracker/st_cb_drawpixels.c @@ -867,30 +867,38 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z, } } + unsigned tex_width = sv[0]->texture->width0; + unsigned tex_height = sv[0]->texture->height0; + /* user textures, plus the drawpix textures */ if (fpv) { /* drawing a color image */ - struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS]; - uint num = MAX3(fpv->drawpix_sampler + 1, - fpv->pixelmap_sampler + 1, - st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]); + struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS] = {0}; + unsigned num_views = + st_get_sampler_views(st, PIPE_SHADER_FRAGMENT, + ctx->FragmentProgram._Current, sampler_views); - memcpy(sampler_views, st->state.frag_sampler_views, - sizeof(sampler_views)); + num_views = MAX3(fpv->drawpix_sampler + 1, fpv->pixelmap_sampler + 1, + num_views); sampler_views[fpv->drawpix_sampler] = sv[0]; if (sv[1]) sampler_views[fpv->pixelmap_sampler] = sv[1]; - pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num, 0, + pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num_views, 0, sampler_views); - st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = - MAX2(st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], num); + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = num_views; + + for (unsigned i = 0; i < num_views; i++) + pipe_sampler_view_reference(&sampler_views[i], NULL); } else { /* drawing a depth/stencil image */ pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num_sampler_view, 0, sv); st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = MAX2(st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], num_sampler_view); + + for (unsigned i = 0; i < num_sampler_view; i++) + pipe_sampler_view_reference(&sv[i], NULL); } /* viewport state: viewport matching window dims */ @@ -923,9 +931,9 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z, const float clip_x1 = x1 / (float) fb_width * 2.0f - 1.0f; const float clip_y1 = y1 / (float) fb_height * 2.0f - 1.0f; const float maxXcoord = normalized ? - ((float) width / sv[0]->texture->width0) : (float) width; + ((float) width / tex_width) : (float) width; const float maxYcoord = normalized - ? ((float) height / sv[0]->texture->height0) : (float) height; + ? ((float) height / tex_height) : (float) height; const float sLeft = 0.0f, sRight = maxXcoord; const float tTop = invertTex ? maxYcoord : 0.0f; const float tBot = invertTex ? 0.0f : maxYcoord; @@ -1435,9 +1443,6 @@ st_DrawPixels(struct gl_context *ctx, GLint x, GLint y, driver_fp, fpv, ctx->Current.RasterColor, GL_FALSE, write_depth, write_stencil); - pipe_sampler_view_reference(&sv[0], NULL); - if (num_sampler_view > 1) - pipe_sampler_view_reference(&sv[1], NULL); /* free the texture (but may persist in the cache) */ pipe_resource_reference(&pt, NULL); @@ -1975,7 +1980,6 @@ st_CopyPixels(struct gl_context *ctx, GLint srcx, GLint srcy, invertTex, write_depth, write_stencil); pipe_resource_reference(&pt, NULL); - pipe_sampler_view_reference(&sv[0], NULL); } diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index a79c8ba0636..6b57538eb86 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -454,8 +454,6 @@ st_context_free_zombie_objects(struct st_context *st) static void st_destroy_context_priv(struct st_context *st, bool destroy_pipe) { - uint i; - st_destroy_atoms(st); st_destroy_draw(st); st_destroy_clear(st); @@ -467,10 +465,6 @@ st_destroy_context_priv(struct st_context *st, bool destroy_pipe) st_destroy_bound_texture_handles(st); st_destroy_bound_image_handles(st); - for (i = 0; i < ARRAY_SIZE(st->state.frag_sampler_views); i++) { - pipe_sampler_view_reference(&st->state.frag_sampler_views[i], NULL); - } - /* free glReadPixels cache data */ st_invalidate_readpix_cache(st); util_throttle_deinit(st->screen, &st->throttle); diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index 618fe760691..85744032d13 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -210,7 +210,6 @@ struct st_context struct pipe_sampler_state frag_samplers[PIPE_MAX_SAMPLERS]; GLuint num_vert_samplers; GLuint num_frag_samplers; - struct pipe_sampler_view *frag_sampler_views[PIPE_MAX_SAMPLERS]; GLuint num_sampler_views[PIPE_SHADER_TYPES]; unsigned num_images[PIPE_SHADER_TYPES]; struct pipe_clip_state clip;