diff options
author | Dave Airlie <[email protected]> | 2012-01-22 16:14:32 +0000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2012-01-22 16:17:47 +0000 |
commit | 9783bba9bdd56cc52f987056ba8dc3da77d0078e (patch) | |
tree | 9aad53a09bd3c8b1c5c0d33cb839d046306436d1 /src/gallium | |
parent | 840a342cd0ac4a9937798a2137122387c0d3d7f6 (diff) |
r600g: initial cube shadow sampling
It doesn't pass the piglit test, but it seems to be a lot closer
than it was before. I need to track down if there is another problem.
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/r600/r600_shader.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index 5609ef153e6..b6fd0f075fe 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -3176,7 +3176,8 @@ static int tgsi_tex(struct r600_shader_ctx *ctx) src_gpr = ctx->temp_reg; } - if (inst->Texture.Texture == TGSI_TEXTURE_CUBE && + if ((inst->Texture.Texture == TGSI_TEXTURE_CUBE || + inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) && inst->Instruction.Opcode != TGSI_OPCODE_TXQ) { static const unsigned src0_swizzle[] = {2, 2, 0, 1}; @@ -3277,7 +3278,19 @@ static int tgsi_tex(struct r600_shader_ctx *ctx) r = r600_bytecode_add_alu(ctx->bc, &alu); if (r) return r; - + /* write initial W value into Z component */ + if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) { + memset(&alu, 0, sizeof(struct r600_bytecode_alu)); + alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); + r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); + alu.dst.sel = ctx->temp_reg; + alu.dst.chan = 2; + alu.dst.write = 1; + alu.last = 1; + r = r600_bytecode_add_alu(ctx->bc, &alu); + if (r) + return r; + } src_loaded = TRUE; src_gpr = ctx->temp_reg; } @@ -3304,6 +3317,7 @@ static int tgsi_tex(struct r600_shader_ctx *ctx) if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || + inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE || inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) { switch (opcode) { @@ -3352,6 +3366,12 @@ static int tgsi_tex(struct r600_shader_ctx *ctx) tex.src_sel_z = 3; tex.src_sel_w = 1; } + if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) { + tex.src_sel_x = 1; + tex.src_sel_y = 0; + tex.src_sel_z = 3; + tex.src_sel_w = 2; /* route Z compare value into W */ + } if (inst->Texture.Texture != TGSI_TEXTURE_RECT && inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) { |