From 52381a7ffba908410f7a53855f082401fca7293a Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Mon, 19 May 2014 17:56:11 -0400 Subject: [PATCH] freedreno/a3xx: shadow sampler support Signed-off-by: Rob Clark --- .../drivers/freedreno/a3xx/fd3_compiler.c | 46 +++++++++++++++++-- .../drivers/freedreno/a3xx/fd3_texture.c | 3 ++ 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_compiler.c b/src/gallium/drivers/freedreno/a3xx/fd3_compiler.c index 48765f3fa03..3159e7adee9 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_compiler.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_compiler.c @@ -1092,26 +1092,51 @@ get_tex_info(struct fd3_compile_context *ctx, .src_wrmask = TGSI_WRITEMASK_XY, .flags = 0, }; + static const struct tex_info tex1ds = { + .order = { 0, -1, 2, -1 }, /* coord.xz */ + .src_wrmask = TGSI_WRITEMASK_XYZ, + .flags = IR3_INSTR_S, + }; static const struct tex_info tex2d = { .order = { 0, 1, -1, -1 }, /* coord.xy */ .src_wrmask = TGSI_WRITEMASK_XY, .flags = 0, }; + static const struct tex_info tex2ds = { + .order = { 0, 1, 2, -1 }, /* coord.xyz */ + .src_wrmask = TGSI_WRITEMASK_XYZ, + .flags = IR3_INSTR_S, + }; static const struct tex_info tex3d = { .order = { 0, 1, 2, -1 }, /* coord.xyz */ .src_wrmask = TGSI_WRITEMASK_XYZ, .flags = IR3_INSTR_3D, }; + static const struct tex_info tex3ds = { + .order = { 0, 1, 2, 3 }, /* coord.xyzw */ + .src_wrmask = TGSI_WRITEMASK_XYZW, + .flags = IR3_INSTR_S | IR3_INSTR_3D, + }; static const struct tex_info txp1d = { .order = { 0, -1, 3, -1 }, /* coord.xw */ .src_wrmask = TGSI_WRITEMASK_XYZ, .flags = IR3_INSTR_P, }; + static const struct tex_info txp1ds = { + .order = { 0, -1, 2, 3 }, /* coord.xzw */ + .src_wrmask = TGSI_WRITEMASK_XYZW, + .flags = IR3_INSTR_P | IR3_INSTR_S, + }; static const struct tex_info txp2d = { .order = { 0, 1, 3, -1 }, /* coord.xyw */ .src_wrmask = TGSI_WRITEMASK_XYZ, .flags = IR3_INSTR_P, }; + static const struct tex_info txp2ds = { + .order = { 0, 1, 2, 3 }, /* coord.xyzw */ + .src_wrmask = TGSI_WRITEMASK_XYZW, + .flags = IR3_INSTR_P | IR3_INSTR_S, + }; static const struct tex_info txp3d = { .order = { 0, 1, 2, 3 }, /* coord.xyzw */ .src_wrmask = TGSI_WRITEMASK_XYZW, @@ -1125,12 +1150,19 @@ get_tex_info(struct fd3_compile_context *ctx, switch (tex) { case TGSI_TEXTURE_1D: return &tex1d; + case TGSI_TEXTURE_SHADOW1D: + return &tex1ds; case TGSI_TEXTURE_2D: case TGSI_TEXTURE_RECT: return &tex2d; + case TGSI_TEXTURE_SHADOW2D: + case TGSI_TEXTURE_SHADOWRECT: + return &tex2ds; case TGSI_TEXTURE_3D: case TGSI_TEXTURE_CUBE: return &tex3d; + case TGSI_TEXTURE_SHADOWCUBE: + return &tex3ds; default: compile_error(ctx, "unknown texture type: %s\n", tgsi_texture_names[tex]); @@ -1141,9 +1173,14 @@ get_tex_info(struct fd3_compile_context *ctx, switch (tex) { case TGSI_TEXTURE_1D: return &txp1d; + case TGSI_TEXTURE_SHADOW1D: + return &txp1ds; case TGSI_TEXTURE_2D: case TGSI_TEXTURE_RECT: return &txp2d; + case TGSI_TEXTURE_SHADOW2D: + case TGSI_TEXTURE_SHADOWRECT: + return &txp2ds; case TGSI_TEXTURE_3D: case TGSI_TEXTURE_CUBE: return &txp3d; @@ -1174,7 +1211,7 @@ get_tex_coord(struct fd3_compile_context *ctx, needs_mov = true; /* 1D textures we fix up w/ 0.0 as 2nd coord: */ - if (tex == TGSI_TEXTURE_1D) + if ((tex == TGSI_TEXTURE_1D) || (tex == TGSI_TEXTURE_SHADOW1D)) needs_mov = true; /* The texture sample instructions need to coord in successive @@ -1197,7 +1234,9 @@ get_tex_coord(struct fd3_compile_context *ctx, /* need to move things around: */ tmp_src = get_internal_temp(ctx, &tmp_dst); - for (j = 0; (j < 4) && (tinf->order[j] >= 0); j++) { + for (j = 0; j < 4; j++) { + if (tinf->order[j] < 0) + continue; instr = instr_create(ctx, 1, 0); /* mov */ instr->cat1.src_type = type_mov; instr->cat1.dst_type = type_mov; @@ -1207,7 +1246,8 @@ get_tex_coord(struct fd3_compile_context *ctx, } /* fix up .y coord: */ - if (tex == TGSI_TEXTURE_1D) { + if ((tex == TGSI_TEXTURE_1D) || + (tex == TGSI_TEXTURE_SHADOW1D)) { instr = instr_create(ctx, 1, 0); /* mov */ instr->cat1.src_type = type_mov; instr->cat1.dst_type = type_mov; diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_texture.c b/src/gallium/drivers/freedreno/a3xx/fd3_texture.c index f9a5b826918..2081775083a 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_texture.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_texture.c @@ -100,6 +100,9 @@ fd3_sampler_state_create(struct pipe_context *pctx, A3XX_TEX_SAMP_0_WRAP_T(tex_clamp(cso->wrap_t)) | A3XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r)); + if (cso->compare_mode) + so->texsamp0 |= A3XX_TEX_SAMP_0_COMPARE_FUNC(cso->compare_func); /* maps 1:1 */ + if (cso->min_mip_filter != PIPE_TEX_MIPFILTER_NONE) { so->texsamp1 = A3XX_TEX_SAMP_1_MIN_LOD(cso->min_lod) | -- 2.30.2