svga: fix texture buffer object regression

With change 8aba778fa2 we stopped binding
sampler objects for texture buffers.  That broke our texture sample /
sampler view setup code.

Now, we loop over the max(num samplers, num sampler views) and handle
the sampler and view information separately.  For texture buffers,
the sampler will be NULL but the sampler view non-null.

Reviewed-by: Charmaine Lee <charmainel@vmware.com>
This commit is contained in:
Brian Paul
2017-06-30 14:08:49 -07:00
parent 6b4bf7e8be
commit e6d1cc31fa

View File

@@ -199,13 +199,13 @@ svga_init_shader_key_common(const struct svga_context *svga,
/* 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],
key->num_textures = MAX2(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];
const struct svga_sampler_state *sampler = svga->curr.sampler[shader][i];
if (view && sampler) {
if (view) {
assert(view->texture);
assert(view->texture->target < (1 << 4)); /* texture_target:4 */
@@ -224,13 +224,6 @@ svga_init_shader_key_common(const struct svga_context *svga,
}
}
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;
++key->num_unnormalized_coords;
}
swizzle_tab = (!util_format_has_alpha(view->format) &&
svga_texture_device_format_has_alpha(view->texture)) ?
set_alpha : copy_alpha;
@@ -246,6 +239,15 @@ svga_init_shader_key_common(const struct svga_context *svga,
key->tex[i].swizzle_b = swizzle_tab[view->swizzle_b];
key->tex[i].swizzle_a = swizzle_tab[view->swizzle_a];
}
if (sampler) {
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;
++key->num_unnormalized_coords;
}
}
}
}