diff --git a/src/mesa/state_tracker/st_cb_bitmap.c b/src/mesa/state_tracker/st_cb_bitmap.c index 6bff3f7f693..32fcd8a49df 100644 --- a/src/mesa/state_tracker/st_cb_bitmap.c +++ b/src/mesa/state_tracker/st_cb_bitmap.c @@ -248,6 +248,8 @@ setup_render_state(struct gl_context *ctx, sizeof(sampler_views)); sampler_views[fpv->bitmap_sampler] = sv; pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num, sampler_views); + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = + MAX2(st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], num); } /* viewport state: viewport matching window dims */ @@ -270,9 +272,19 @@ restore_render_state(struct gl_context *ctx) { struct st_context *st = st_context(ctx); struct cso_context *cso = st->cso_context; + struct pipe_context *pipe = st->pipe; cso_restore_state(cso); + /* Unbind all because st/mesa won't do it if the current shader doesn't + * use them. + */ + static struct pipe_sampler_view *null[PIPE_MAX_SAMPLERS]; + pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], + null); + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = 0; + st->dirty |= ST_NEW_VERTEX_ARRAYS | ST_NEW_FS_SAMPLER_VIEWS; } @@ -763,6 +775,8 @@ st_DrawAtlasBitmaps(struct gl_context *ctx, u_upload_unmap(pipe->stream_uploader); cso_set_vertex_buffers(st->cso_context, 0, 1, &vb); + st->last_num_vbuffers = MAX2(st->last_num_vbuffers, 1); + cso_draw_arrays(st->cso_context, PIPE_PRIM_QUADS, 0, num_verts); out: diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c index 4aa2258263b..0564a694d44 100644 --- a/src/mesa/state_tracker/st_cb_drawpixels.c +++ b/src/mesa/state_tracker/st_cb_drawpixels.c @@ -882,9 +882,13 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z, if (sv[1]) sampler_views[fpv->pixelmap_sampler] = sv[1]; pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num, sampler_views); + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = + MAX2(st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], num); } else { /* drawing a depth/stencil image */ pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num_sampler_view, sv); + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = + MAX2(st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], num_sampler_view); } /* viewport state: viewport matching window dims */ @@ -933,6 +937,15 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z, /* restore state */ cso_restore_state(cso); + /* Unbind all because st/mesa won't do it if the current shader doesn't + * use them. + */ + static struct pipe_sampler_view *null[PIPE_MAX_SAMPLERS]; + pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], + null); + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = 0; + st->dirty |= ST_NEW_VERTEX_ARRAYS | ST_NEW_FS_SAMPLER_VIEWS; } diff --git a/src/mesa/state_tracker/st_cb_drawtex.c b/src/mesa/state_tracker/st_cb_drawtex.c index 56b4f05269d..88865cd5e27 100644 --- a/src/mesa/state_tracker/st_cb_drawtex.c +++ b/src/mesa/state_tracker/st_cb_drawtex.c @@ -338,6 +338,7 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z, PIPE_PRIM_TRIANGLE_FAN, 4, /* verts */ numAttribs); /* attribs/vert */ + st->last_num_vbuffers = MAX2(st->last_num_vbuffers, 1); pipe_resource_reference(&vbuffer, NULL); diff --git a/src/mesa/state_tracker/st_cb_readpixels.c b/src/mesa/state_tracker/st_cb_readpixels.c index 0db77cf497b..cc346117ecb 100644 --- a/src/mesa/state_tracker/st_cb_readpixels.c +++ b/src/mesa/state_tracker/st_cb_readpixels.c @@ -190,6 +190,8 @@ try_pbo_readpixels(struct st_context *st, struct st_renderbuffer *strb, goto fail; pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 1, &sampler_view); + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = + MAX2(st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], 1); pipe_sampler_view_reference(&sampler_view, NULL); @@ -253,6 +255,16 @@ try_pbo_readpixels(struct st_context *st, struct st_renderbuffer *strb, fail: cso_restore_state(cso); + /* Unbind all because st/mesa won't do it if the current shader doesn't + * use them. + */ + static struct pipe_sampler_view *null[PIPE_MAX_SAMPLERS]; + pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], + null); + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = 0; + pipe->set_shader_images(pipe, PIPE_SHADER_FRAGMENT, 0, 1, NULL); + st->dirty |= ST_NEW_FS_CONSTANTS | ST_NEW_FS_IMAGES | ST_NEW_FS_SAMPLER_VIEWS | diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index cce9d523e3f..f20afbacdb4 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -1313,6 +1313,8 @@ try_pbo_upload_common(struct gl_context *ctx, goto fail; pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 1, &sampler_view); + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = + MAX2(st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], 1); pipe_sampler_view_reference(&sampler_view, NULL); } @@ -1349,6 +1351,15 @@ try_pbo_upload_common(struct gl_context *ctx, fail: cso_restore_state(cso); + /* Unbind all because st/mesa won't do it if the current shader doesn't + * use them. + */ + static struct pipe_sampler_view *null[PIPE_MAX_SAMPLERS]; + pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], + null); + st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = 0; + st->dirty |= ST_NEW_VERTEX_ARRAYS | ST_NEW_FS_CONSTANTS | ST_NEW_FS_SAMPLER_VIEWS; diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index c11934c0a39..c95fbd411ad 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -543,6 +543,7 @@ st_draw_quad(struct st_context *st, u_upload_unmap(st->pipe->stream_uploader); cso_set_vertex_buffers(st->cso_context, 0, 1, &vb); + st->last_num_vbuffers = MAX2(st->last_num_vbuffers, 1); if (num_instances > 1) { cso_draw_arrays_instanced(st->cso_context, PIPE_PRIM_TRIANGLE_FAN, 0, 4, diff --git a/src/mesa/state_tracker/st_pbo.c b/src/mesa/state_tracker/st_pbo.c index e20de8baada..627e62e6ac2 100644 --- a/src/mesa/state_tracker/st_pbo.c +++ b/src/mesa/state_tracker/st_pbo.c @@ -256,6 +256,7 @@ st_pbo_draw(struct st_context *st, const struct st_pbo_addresses *addr, cso_set_vertex_elements(cso, &velem); cso_set_vertex_buffers(cso, 0, 1, &vbo); + st->last_num_vbuffers = MAX2(st->last_num_vbuffers, 1); pipe_resource_reference(&vbo.buffer.resource, NULL); }