diff options
-rw-r--r-- | src/gallium/auxiliary/cso_cache/cso_context.c | 65 |
1 files changed, 44 insertions, 21 deletions
diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c index 6805427b816..60c9a9673d5 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.c +++ b/src/gallium/auxiliary/cso_cache/cso_context.c @@ -304,9 +304,26 @@ void cso_release_all( struct cso_context *ctx ) if (ctx->pipe) { ctx->pipe->bind_blend_state( ctx->pipe, NULL ); ctx->pipe->bind_rasterizer_state( ctx->pipe, NULL ); - ctx->pipe->bind_fragment_sampler_states( ctx->pipe, 0, NULL ); - if (ctx->pipe->bind_vertex_sampler_states) - ctx->pipe->bind_vertex_sampler_states(ctx->pipe, 0, NULL); + + if (ctx->pipe->bind_sampler_states) { + static void *zeros[PIPE_MAX_SAMPLERS] = { NULL }; + struct pipe_screen *scr = ctx->pipe->screen; + unsigned sh; + for (sh = 0; sh < PIPE_SHADER_TYPES; sh++) { + int max = scr->get_shader_param(scr, sh, + PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS); + assert(max <= PIPE_MAX_SAMPLERS); + if (max > 0) { + ctx->pipe->bind_sampler_states(ctx->pipe, sh, 0, max, zeros); + } + } + } + else { + ctx->pipe->bind_fragment_sampler_states( ctx->pipe, 0, NULL ); + if (ctx->pipe->bind_vertex_sampler_states) + ctx->pipe->bind_vertex_sampler_states(ctx->pipe, 0, NULL); + } + ctx->pipe->bind_depth_stencil_alpha_state( ctx->pipe, NULL ); ctx->pipe->bind_fs_state( ctx->pipe, NULL ); ctx->pipe->bind_vs_state( ctx->pipe, NULL ); @@ -1079,24 +1096,30 @@ single_sampler_done(struct cso_context *ctx, unsigned shader_stage) info->nr_samplers * sizeof(void *)); info->hw.nr_samplers = info->nr_samplers; - switch (shader_stage) { - case PIPE_SHADER_FRAGMENT: - ctx->pipe->bind_fragment_sampler_states(ctx->pipe, - info->nr_samplers, - info->samplers); - break; - case PIPE_SHADER_VERTEX: - ctx->pipe->bind_vertex_sampler_states(ctx->pipe, - info->nr_samplers, - info->samplers); - break; - case PIPE_SHADER_GEOMETRY: - ctx->pipe->bind_geometry_sampler_states(ctx->pipe, - info->nr_samplers, - info->samplers); - break; - default: - assert(!"bad shader type in single_sampler_done()"); + if (ctx->pipe->bind_sampler_states) { + ctx->pipe->bind_sampler_states(ctx->pipe, shader_stage, 0, + info->nr_samplers, info->samplers); + } + else { + switch (shader_stage) { + case PIPE_SHADER_FRAGMENT: + ctx->pipe->bind_fragment_sampler_states(ctx->pipe, + info->nr_samplers, + info->samplers); + break; + case PIPE_SHADER_VERTEX: + ctx->pipe->bind_vertex_sampler_states(ctx->pipe, + info->nr_samplers, + info->samplers); + break; + case PIPE_SHADER_GEOMETRY: + ctx->pipe->bind_geometry_sampler_states(ctx->pipe, + info->nr_samplers, + info->samplers); + break; + default: + assert(!"bad shader type in single_sampler_done()"); + } } } } |