summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/svga/svga_shader.c
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2016-07-15 07:08:13 -0600
committerBrian Paul <[email protected]>2016-07-15 11:05:18 -0600
commit50a669de4e216d2e3bea3ec1148c7e79f77ecb27 (patch)
treecd31ee13b79761bbfb958da7e56e6cb8c6ec5300 /src/gallium/drivers/svga/svga_shader.c
parentb9d10e79c88842ba05d6937a3803cb5740b866da (diff)
svga: handle mismatched number of samplers, sampler views
in svga_init_shader_key_common(). Since the CSO module only tracks sampler views for fragment shaders, the number of samplers and sampler views can be mismatched for other types of shaders. This situation triggered an assertion in Chrome with maps.google.com This patch adds defensive code to handle that situation. Fixes VMware bug 1694027 Cc: <[email protected]> Reviewed-by: Charmaine Lee <[email protected]>
Diffstat (limited to 'src/gallium/drivers/svga/svga_shader.c')
-rw-r--r--src/gallium/drivers/svga/svga_shader.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/gallium/drivers/svga/svga_shader.c b/src/gallium/drivers/svga/svga_shader.c
index abfef0f1044..9e37e237a7d 100644
--- a/src/gallium/drivers/svga/svga_shader.c
+++ b/src/gallium/drivers/svga/svga_shader.c
@@ -173,10 +173,16 @@ svga_init_shader_key_common(const struct svga_context *svga, unsigned shader,
assert(shader < ARRAY_SIZE(svga->curr.num_sampler_views));
- for (i = 0; i < svga->curr.num_sampler_views[shader]; i++) {
+ /* In case the number of samplers and sampler_views doesn't match,
+ * loop over the lower of the two counts.
+ */
+ key->num_textures = MIN2(svga->curr.num_sampler_views[shader],
+ svga->curr.num_samplers[shader]);
+
+ for (i = 0; i < key->num_textures; i++) {
struct pipe_sampler_view *view = svga->curr.sampler_views[shader][i];
- if (view) {
- assert(svga->curr.sampler[shader][i]);
+ const struct svga_sampler_state *sampler = svga->curr.sampler[shader][i];
+ if (view && sampler) {
assert(view->texture);
assert(view->texture->target < (1 << 4)); /* texture_target:4 */
@@ -195,7 +201,7 @@ svga_init_shader_key_common(const struct svga_context *svga, unsigned shader,
}
}
- if (!svga->curr.sampler[shader][i]->normalized_coords) {
+ if (!sampler->normalized_coords) {
assert(idx < (1 << 5)); /* width_height_idx:5 bitfield */
key->tex[i].width_height_idx = idx++;
key->tex[i].unnormalized = TRUE;
@@ -208,7 +214,6 @@ svga_init_shader_key_common(const struct svga_context *svga, unsigned shader,
key->tex[i].swizzle_a = view->swizzle_a;
}
}
- key->num_textures = svga->curr.num_sampler_views[shader];
}