diff options
author | Rob Clark <[email protected]> | 2014-05-19 17:56:11 -0400 |
---|---|---|
committer | Rob Clark <[email protected]> | 2014-05-19 21:17:25 -0400 |
commit | 52381a7ffba908410f7a53855f082401fca7293a (patch) | |
tree | 8ebef95af163f6d3995040bcb93d75d77f008d41 | |
parent | 08b9180819de65190dbc1cb3f53d12d429ec3d95 (diff) |
freedreno/a3xx: shadow sampler support
Signed-off-by: Rob Clark <[email protected]>
-rw-r--r-- | src/gallium/drivers/freedreno/a3xx/fd3_compiler.c | 46 | ||||
-rw-r--r-- | src/gallium/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) | |