summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2017-11-15 08:26:23 +1000
committerDave Airlie <[email protected]>2017-11-15 11:26:11 +1000
commit3ceee04a4f963694012ca7f9acd3c747a036472e (patch)
treeaf912b7b7fd3ba2cc2d2f9db25277cd7b919962c
parent7676e71113f0a5312de83c966458f38610a544af (diff)
r600: fix cubemap arrays
A lot of cubemap array piglits fail, port the texture type picking code from radeonsi which seems to fix most of them. For images I will port the rest of the code. Fixes: getteximage-depth gl_texture_cube_map_array-* fbo-generatemipmap-cubemap array getteximage-targets cube_array amongst others. Reviewed-by: Roland Scheidegger <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
-rw-r--r--src/gallium/drivers/r600/evergreen_state.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
index 68977bb36de..b02d7eeca62 100644
--- a/src/gallium/drivers/r600/evergreen_state.c
+++ b/src/gallium/drivers/r600/evergreen_state.c
@@ -169,9 +169,20 @@ static uint32_t r600_translate_blend_factor(int blend_fact)
return 0;
}
-static unsigned r600_tex_dim(unsigned dim, unsigned nr_samples)
+static unsigned r600_tex_dim(struct r600_texture *rtex,
+ unsigned view_target, unsigned nr_samples)
{
- switch (dim) {
+ unsigned res_target = rtex->resource.b.b.target;
+
+ if (view_target == PIPE_TEXTURE_CUBE ||
+ view_target == PIPE_TEXTURE_CUBE_ARRAY)
+ res_target = view_target;
+ /* If interpreting cubemaps as something else, set 2D_ARRAY. */
+ else if (res_target == PIPE_TEXTURE_CUBE ||
+ res_target == PIPE_TEXTURE_CUBE_ARRAY)
+ res_target = PIPE_TEXTURE_2D_ARRAY;
+
+ switch (res_target) {
default:
case PIPE_TEXTURE_1D:
return V_030000_SQ_TEX_DIM_1D;
@@ -805,13 +816,10 @@ static int evergreen_fill_tex_resource_words(struct r600_context *rctx,
va = tmp->resource.gpu_address;
/* array type views and views into array types need to use layer offset */
- dim = params->target;
- if (params->target != PIPE_TEXTURE_CUBE)
- dim = MAX2(params->target, texture->target);
-
- tex_resource_words[0] = (S_030000_DIM(r600_tex_dim(dim, texture->nr_samples)) |
- S_030000_PITCH((pitch / 8) - 1) |
- S_030000_TEX_WIDTH(width - 1));
+ dim = r600_tex_dim(tmp, params->target, texture->nr_samples);
+ tex_resource_words[0] = (S_030000_DIM(dim) |
+ S_030000_PITCH((pitch / 8) - 1) |
+ S_030000_TEX_WIDTH(width - 1));
if (rscreen->b.chip_class == CAYMAN)
tex_resource_words[0] |= CM_S_030000_NON_DISP_TILING_ORDER(non_disp_tiling);
else