mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-29 02:00:37 +02:00
llvmpipe: enable ARB_texture_view
All the functionality was pretty much there, just not tested. Trivially fix up the missing pieces (take target info from view not resource), and add some missing bits for cubes. Also add some minimal debug validation to detect uninitialized target values in the view... 49 new piglits, 47 pass, 2 fail (both related to fake multisampling, not texture_view itself). No other piglit changes. v2: move sampler view validation to sampler view creation, update docs. Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
2712f70d57
commit
e6c66f4fb0
6 changed files with 47 additions and 11 deletions
|
|
@ -169,7 +169,7 @@ GL 4.3, GLSL 4.30:
|
|||
GL_ARB_texture_buffer_range DONE (nv50, nvc0, i965, r600, radeonsi, llvmpipe)
|
||||
GL_ARB_texture_query_levels DONE (all drivers that support GLSL 1.30)
|
||||
GL_ARB_texture_storage_multisample DONE (all drivers that support GL_ARB_texture_multisample)
|
||||
GL_ARB_texture_view DONE (i965, nv50, nvc0)
|
||||
GL_ARB_texture_view DONE (i965, nv50, nvc0, llvmpipe)
|
||||
GL_ARB_vertex_attrib_binding DONE (all drivers)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ Note: some of the new features are only available with certain drivers.
|
|||
<li>GL_ARB_pipeline_statistics_query on i965, nv50, nvc0, r600, radeonsi, softpipe</li>
|
||||
<li>GL_ARB_program_interface_query (all drivers)</li>
|
||||
<li>GL_ARB_texture_stencil8 on nv50, nvc0, r600, radeonsi, softpipe</li>
|
||||
<li>GL_ARB_texture_view on llvmpipe</li>
|
||||
<li>GL_ARB_uniform_buffer_object on freedreno</li>
|
||||
<li>GL_ARB_vertex_attrib_64bit on nvc0, softpipe</li>
|
||||
<li>GL_ARB_viewport_array, GL_AMD_vertex_shader_viewport_index on i965/gen6</li>
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ lp_sampler_static_texture_state(struct lp_static_texture_state *state,
|
|||
state->swizzle_b = view->swizzle_b;
|
||||
state->swizzle_a = view->swizzle_a;
|
||||
|
||||
state->target = texture->target;
|
||||
state->target = view->target;
|
||||
state->pot_width = util_is_power_of_two(texture->width0);
|
||||
state->pot_height = util_is_power_of_two(texture->height0);
|
||||
state->pot_depth = util_is_power_of_two(texture->depth0);
|
||||
|
|
|
|||
|
|
@ -258,8 +258,9 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
|
|||
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
||||
return 1;
|
||||
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
|
||||
case PIPE_CAP_SAMPLER_VIEW_TARGET:
|
||||
return 0;
|
||||
case PIPE_CAP_SAMPLER_VIEW_TARGET:
|
||||
return 1;
|
||||
case PIPE_CAP_FAKE_SW_MSAA:
|
||||
return 1;
|
||||
case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
|
||||
|
|
|
|||
|
|
@ -854,9 +854,10 @@ lp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
|
|||
jit_tex->img_stride[j] = lp_tex->img_stride[j];
|
||||
}
|
||||
|
||||
if (res->target == PIPE_TEXTURE_1D_ARRAY ||
|
||||
res->target == PIPE_TEXTURE_2D_ARRAY ||
|
||||
res->target == PIPE_TEXTURE_CUBE_ARRAY) {
|
||||
if (view->target == PIPE_TEXTURE_1D_ARRAY ||
|
||||
view->target == PIPE_TEXTURE_2D_ARRAY ||
|
||||
view->target == PIPE_TEXTURE_CUBE ||
|
||||
view->target == PIPE_TEXTURE_CUBE_ARRAY) {
|
||||
/*
|
||||
* For array textures, we don't have first_layer, instead
|
||||
* adjust last_layer (stored as depth) plus the mip level offsets
|
||||
|
|
@ -868,7 +869,8 @@ lp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
|
|||
jit_tex->mip_offsets[j] += view->u.tex.first_layer *
|
||||
lp_tex->img_stride[j];
|
||||
}
|
||||
if (res->target == PIPE_TEXTURE_CUBE_ARRAY) {
|
||||
if (view->target == PIPE_TEXTURE_CUBE ||
|
||||
view->target == PIPE_TEXTURE_CUBE_ARRAY) {
|
||||
assert(jit_tex->depth % 6 == 0);
|
||||
}
|
||||
assert(view->u.tex.first_layer <= view->u.tex.last_layer);
|
||||
|
|
|
|||
|
|
@ -170,6 +170,36 @@ llvmpipe_create_sampler_view(struct pipe_context *pipe,
|
|||
view->texture = NULL;
|
||||
pipe_resource_reference(&view->texture, texture);
|
||||
view->context = pipe;
|
||||
|
||||
#ifdef DEBUG
|
||||
/*
|
||||
* This is possibly too lenient, but the primary reason is just
|
||||
* to catch state trackers which forget to initialize this, so
|
||||
* it only catches clearly impossible view targets.
|
||||
*/
|
||||
if (view->target != texture->target) {
|
||||
if (view->target == PIPE_TEXTURE_1D)
|
||||
assert(texture->target == PIPE_TEXTURE_1D_ARRAY);
|
||||
else if (view->target == PIPE_TEXTURE_1D_ARRAY)
|
||||
assert(texture->target == PIPE_TEXTURE_1D);
|
||||
else if (view->target == PIPE_TEXTURE_2D)
|
||||
assert(texture->target == PIPE_TEXTURE_2D_ARRAY ||
|
||||
texture->target == PIPE_TEXTURE_CUBE ||
|
||||
texture->target == PIPE_TEXTURE_CUBE_ARRAY);
|
||||
else if (view->target == PIPE_TEXTURE_2D_ARRAY)
|
||||
assert(texture->target == PIPE_TEXTURE_2D ||
|
||||
texture->target == PIPE_TEXTURE_CUBE ||
|
||||
texture->target == PIPE_TEXTURE_CUBE_ARRAY);
|
||||
else if (view->target == PIPE_TEXTURE_CUBE)
|
||||
assert(texture->target == PIPE_TEXTURE_CUBE_ARRAY ||
|
||||
texture->target == PIPE_TEXTURE_2D_ARRAY);
|
||||
else if (view->target == PIPE_TEXTURE_CUBE_ARRAY)
|
||||
assert(texture->target == PIPE_TEXTURE_CUBE ||
|
||||
texture->target == PIPE_TEXTURE_2D_ARRAY);
|
||||
else
|
||||
assert(0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return view;
|
||||
|
|
@ -245,15 +275,17 @@ prepare_shader_sampling(
|
|||
row_stride[j] = lp_tex->row_stride[j];
|
||||
img_stride[j] = lp_tex->img_stride[j];
|
||||
}
|
||||
if (res->target == PIPE_TEXTURE_1D_ARRAY ||
|
||||
res->target == PIPE_TEXTURE_2D_ARRAY ||
|
||||
res->target == PIPE_TEXTURE_CUBE_ARRAY) {
|
||||
if (view->target == PIPE_TEXTURE_1D_ARRAY ||
|
||||
view->target == PIPE_TEXTURE_2D_ARRAY ||
|
||||
view->target == PIPE_TEXTURE_CUBE ||
|
||||
view->target == PIPE_TEXTURE_CUBE_ARRAY) {
|
||||
num_layers = view->u.tex.last_layer - view->u.tex.first_layer + 1;
|
||||
for (j = first_level; j <= last_level; j++) {
|
||||
mip_offsets[j] += view->u.tex.first_layer *
|
||||
lp_tex->img_stride[j];
|
||||
}
|
||||
if (res->target == PIPE_TEXTURE_CUBE_ARRAY) {
|
||||
if (view->target == PIPE_TEXTURE_CUBE ||
|
||||
view->target == PIPE_TEXTURE_CUBE_ARRAY) {
|
||||
assert(num_layers % 6 == 0);
|
||||
}
|
||||
assert(view->u.tex.first_layer <= view->u.tex.last_layer);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue