Hacking around with shaders. Pretty sure this is all wrong.

This commit is contained in:
Ben Vanik 2013-10-27 18:33:50 -07:00
parent 0355047838
commit 2de906f3d6
2 changed files with 125 additions and 34 deletions

View File

@ -22,6 +22,8 @@ using namespace xe::gpu::xenos;
namespace { namespace {
const uint32_t MAX_INTERPOLATORS = 16;
const int OUTPUT_CAPACITY = 64 * 1024; const int OUTPUT_CAPACITY = 64 * 1024;
} // anonymous namespace } // anonymous namespace
@ -199,6 +201,13 @@ int D3D11VertexShader::Prepare(xe_gpu_program_cntl_t* program_cntl) {
DXGI_FORMAT_R8G8B8A8_SINT : DXGI_FORMAT_R8G8B8A8_UINT; DXGI_FORMAT_R8G8B8A8_SINT : DXGI_FORMAT_R8G8B8A8_UINT;
} }
break; break;
case FMT_2_10_10_10:
if (!vtx.num_format_all) {
vtx_format = DXGI_FORMAT_R10G10B10A2_UNORM;
} else {
vtx_format = DXGI_FORMAT_R10G10B10A2_UINT;
}
break;
case FMT_8_8: case FMT_8_8:
if (!vtx.num_format_all) { if (!vtx.num_format_all) {
vtx_format = vtx.format_comp_all ? vtx_format = vtx.format_comp_all ?
@ -336,7 +345,7 @@ const char* D3D11VertexShader::Translate(xe_gpu_program_cntl_t* program_cntl) {
if (alloc_counts_.params) { if (alloc_counts_.params) {
output->append( output->append(
" float4 o[%d] : XE_O;\n", " float4 o[%d] : XE_O;\n",
alloc_counts_.params); MAX_INTERPOLATORS);
} }
output->append( output->append(
"};\n"); "};\n");
@ -348,16 +357,20 @@ const char* D3D11VertexShader::Translate(xe_gpu_program_cntl_t* program_cntl) {
// TODO(benvanik): remove this, if possible (though the compiler may be smart // TODO(benvanik): remove this, if possible (though the compiler may be smart
// enough to do it for us). // enough to do it for us).
for (uint32_t n = 0; n < alloc_counts_.params; n++) { if (alloc_counts_.params) {
output->append( for (uint32_t n = 0; n < MAX_INTERPOLATORS; n++) {
" o.o[%d] = float4(0.0, 0.0, 0.0, 0.0);\n", n); output->append(
" o.o[%d] = float4(0.0, 0.0, 0.0, 0.0);\n", n);
}
} }
// Add temporaries for any registers we may use. // Add temporaries for any registers we may use.
for (uint32_t n = 0; n <= program_cntl->vs_regs; n++) { uint32_t temp_regs = program_cntl->vs_regs + program_cntl->ps_regs;
for (uint32_t n = 0; n <= temp_regs; n++) {
output->append( output->append(
" float4 r%d;\n", n); " float4 r%d = c[%d];\n", n, n);
} }
output->append(" float4 t;\n");
// Execute blocks. // Execute blocks.
for (std::vector<instr_cf_exec_t>::iterator it = execs_.begin(); for (std::vector<instr_cf_exec_t>::iterator it = execs_.begin();
@ -474,7 +487,7 @@ const char* D3D11PixelShader::Translate(
if (input_alloc_counts.params) { if (input_alloc_counts.params) {
output->append( output->append(
" float4 o[%d] : XE_O;\n", " float4 o[%d] : XE_O;\n",
input_alloc_counts.params); MAX_INTERPOLATORS);
} }
output->append( output->append(
"};\n"); "};\n");
@ -500,15 +513,19 @@ const char* D3D11PixelShader::Translate(
" PS_OUTPUT o;\n"); " PS_OUTPUT o;\n");
// Add temporary registers. // Add temporary registers.
for (uint32_t n = 0; n <= program_cntl->ps_regs; n++) { uint32_t temp_regs = program_cntl->vs_regs + program_cntl->ps_regs;
for (uint32_t n = 0; n <= MAX(15, temp_regs); n++) {
output->append( output->append(
" float4 r%d;\n", n); " float4 r%d = c[%d];\n", n, n);
} }
output->append(" float4 t;\n");
// Bring registers local. // Bring registers local.
for (uint32_t n = 0; n < input_alloc_counts.params; n++) { if (input_alloc_counts.params) {
output->append( for (uint32_t n = 0; n < MAX_INTERPOLATORS; n++) {
" r%d = i.o[%d];\n", n, n); output->append(
" r%d = i.o[%d];\n", n, n);
}
} }
// Execute blocks. // Execute blocks.
@ -568,9 +585,9 @@ void AppendSrcReg(
} }
} }
void AppendDestReg( void AppendDestRegName(
xe_gpu_translate_ctx_t& ctx, xe_gpu_translate_ctx_t& ctx,
uint32_t num, uint32_t mask, uint32_t dst_exp) { uint32_t num, uint32_t dst_exp) {
if (!dst_exp) { if (!dst_exp) {
// Register. // Register.
ctx.output->append("r%u", num); ctx.output->append("r%u", num);
@ -605,17 +622,43 @@ void AppendDestReg(
break; break;
} }
} }
// TODO(benvanik): masking! }
if (mask != 0xf) {
// ctx.output->append("."); void AppendDestReg(
xe_gpu_translate_ctx_t& ctx,
uint32_t num, uint32_t mask, uint32_t dst_exp) {
if (mask != 0xF) {
// If masking, store to a temporary variable and clean it up later.
ctx.output->append("t");
} else {
// Store directly to output.
AppendDestRegName(ctx, num, dst_exp);
}
}
void AppendDestRegPost(
xe_gpu_translate_ctx_t& ctx,
uint32_t num, uint32_t mask, uint32_t dst_exp) {
if (mask != 0xF) {
// Masking.
ctx.output->append(" ");
AppendDestRegName(ctx, num, dst_exp);
ctx.output->append(" = float4(");
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
// TODO(benvanik): mask out values? mix in old value as temp? // TODO(benvanik): mask out values? mix in old value as temp?
// ctx.output->append("%c", (mask & 0x1) ? chan_names[i] : 'w'); // ctx.output->append("%c", (mask & 0x1) ? chan_names[i] : 'w');
if (!(mask & 0x1)) { if (!(mask & 0x1)) {
XELOGW("D3D11 shader compiler skipping dest write mask!"); AppendDestRegName(ctx, num, dst_exp);
} else {
ctx.output->append("t");
} }
ctx.output->append(".%c", chan_names[i]);
mask >>= 1; mask >>= 1;
if (i < 3) {
ctx.output->append(", ");
}
} }
ctx.output->append(");\n");
} }
} }
@ -694,6 +737,7 @@ int TranslateALU_ADDv(
ctx.output->append(")"); ctx.output->append(")");
} }
ctx.output->append(";\n"); ctx.output->append(";\n");
AppendDestRegPost(ctx, alu.vector_dest, alu.vector_write_mask, alu.export_data);
return 0; return 0;
} }
@ -713,6 +757,7 @@ int TranslateALU_MULv(
ctx.output->append(")"); ctx.output->append(")");
} }
ctx.output->append(";\n"); ctx.output->append(";\n");
AppendDestRegPost(ctx, alu.vector_dest, alu.vector_write_mask, alu.export_data);
return 0; return 0;
} }
@ -741,6 +786,7 @@ int TranslateALU_MAXv(
ctx.output->append(")"); ctx.output->append(")");
} }
ctx.output->append(";\n"); ctx.output->append(";\n");
AppendDestRegPost(ctx, alu.vector_dest, alu.vector_write_mask, alu.export_data);
return 0; return 0;
} }
@ -760,6 +806,7 @@ int TranslateALU_MINv(
ctx.output->append(")"); ctx.output->append(")");
} }
ctx.output->append(";\n"); ctx.output->append(";\n");
AppendDestRegPost(ctx, alu.vector_dest, alu.vector_write_mask, alu.export_data);
return 0; return 0;
} }
@ -777,6 +824,7 @@ int TranslateALU_FRACv(
ctx.output->append(")"); ctx.output->append(")");
} }
ctx.output->append(";\n"); ctx.output->append(";\n");
AppendDestRegPost(ctx, alu.vector_dest, alu.vector_write_mask, alu.export_data);
return 0; return 0;
} }
@ -794,6 +842,7 @@ int TranslateALU_TRUNCv(
ctx.output->append(")"); ctx.output->append(")");
} }
ctx.output->append(";\n"); ctx.output->append(";\n");
AppendDestRegPost(ctx, alu.vector_dest, alu.vector_write_mask, alu.export_data);
return 0; return 0;
} }
@ -811,6 +860,7 @@ int TranslateALU_FLOORv(
ctx.output->append(")"); ctx.output->append(")");
} }
ctx.output->append(";\n"); ctx.output->append(";\n");
AppendDestRegPost(ctx, alu.vector_dest, alu.vector_write_mask, alu.export_data);
return 0; return 0;
} }
@ -835,6 +885,47 @@ int TranslateALU_MULADDv(
ctx.output->append(")"); ctx.output->append(")");
} }
ctx.output->append(";\n"); ctx.output->append(";\n");
AppendDestRegPost(ctx, alu.vector_dest, alu.vector_write_mask, alu.export_data);
return 0;
}
int TranslateALU_DOT4v(
xe_gpu_translate_ctx_t& ctx, const instr_alu_t& alu) {
AppendDestReg(ctx, alu.vector_dest, alu.vector_write_mask, alu.export_data);
ctx.output->append(" = ");
if (alu.vector_clamp) {
ctx.output->append("saturate(");
}
ctx.output->append("dot(");
AppendSrcReg(ctx, alu.src1_reg, alu.src1_sel, alu.src1_swiz, alu.src1_reg_negate, alu.src1_reg_abs);
ctx.output->append(", ");
AppendSrcReg(ctx, alu.src2_reg, alu.src2_sel, alu.src2_swiz, alu.src2_reg_negate, alu.src2_reg_abs);
ctx.output->append(")");
if (alu.vector_clamp) {
ctx.output->append(")");
}
ctx.output->append(";\n");
AppendDestRegPost(ctx, alu.vector_dest, alu.vector_write_mask, alu.export_data);
return 0;
}
int TranslateALU_DOT3v(
xe_gpu_translate_ctx_t& ctx, const instr_alu_t& alu) {
AppendDestReg(ctx, alu.vector_dest, alu.vector_write_mask, alu.export_data);
ctx.output->append(" = ");
if (alu.vector_clamp) {
ctx.output->append("saturate(");
}
ctx.output->append("dot(float4(");
AppendSrcReg(ctx, alu.src1_reg, alu.src1_sel, alu.src1_swiz, alu.src1_reg_negate, alu.src1_reg_abs);
ctx.output->append(").xyz, float4(");
AppendSrcReg(ctx, alu.src2_reg, alu.src2_sel, alu.src2_swiz, alu.src2_reg_negate, alu.src2_reg_abs);
ctx.output->append(").xyz)");
if (alu.vector_clamp) {
ctx.output->append(")");
}
ctx.output->append(";\n");
AppendDestRegPost(ctx, alu.vector_dest, alu.vector_write_mask, alu.export_data);
return 0; return 0;
} }
@ -865,8 +956,8 @@ static xe_gpu_translate_alu_info_t vector_alu_instrs[0x20] = {
ALU_INSTR(CNDEv, 3), // 12 ALU_INSTR(CNDEv, 3), // 12
ALU_INSTR(CNDGTEv, 3), // 13 ALU_INSTR(CNDGTEv, 3), // 13
ALU_INSTR(CNDGTv, 3), // 14 ALU_INSTR(CNDGTv, 3), // 14
ALU_INSTR(DOT4v, 2), // 15 ALU_INSTR_IMPL(DOT4v, 2), // 15
ALU_INSTR(DOT3v, 2), // 16 ALU_INSTR_IMPL(DOT3v, 2), // 16
ALU_INSTR(DOT2ADDv, 3), // 17 -- ??? ALU_INSTR(DOT2ADDv, 3), // 17 -- ???
ALU_INSTR(CUBEv, 2), // 18 ALU_INSTR(CUBEv, 2), // 18
ALU_INSTR(MAX4v, 1), // 19 ALU_INSTR(MAX4v, 1), // 19
@ -924,12 +1015,12 @@ static xe_gpu_translate_alu_info_t scalar_alu_instrs[0x40] = {
ALU_INSTR(KILLONEs, 1), // 39 ALU_INSTR(KILLONEs, 1), // 39
ALU_INSTR(SQRT_IEEE, 1), // 40 ALU_INSTR(SQRT_IEEE, 1), // 40
{ 0, 0, false }, { 0, 0, false },
ALU_INSTR(MUL_CONST_0, 1), // 42 ALU_INSTR(MUL_CONST_0, 2), // 42
ALU_INSTR(MUL_CONST_1, 1), // 43 ALU_INSTR(MUL_CONST_1, 2), // 43
ALU_INSTR(ADD_CONST_0, 1), // 44 ALU_INSTR(ADD_CONST_0, 2), // 44
ALU_INSTR(ADD_CONST_1, 1), // 45 ALU_INSTR(ADD_CONST_1, 2), // 45
ALU_INSTR(SUB_CONST_0, 1), // 46 ALU_INSTR(SUB_CONST_0, 2), // 46
ALU_INSTR(SUB_CONST_1, 1), // 47 ALU_INSTR(SUB_CONST_1, 2), // 47
ALU_INSTR(SIN, 1), // 48 ALU_INSTR(SIN, 1), // 48
ALU_INSTR(COS, 1), // 49 ALU_INSTR(COS, 1), // 49
ALU_INSTR(RETAIN_PREV, 1), // 50 ALU_INSTR(RETAIN_PREV, 1), // 50
@ -1045,7 +1136,7 @@ struct {
{0}, {0},
{0}, {0},
TYPE(FMT_8_8_8_8), // 6 TYPE(FMT_8_8_8_8), // 6
{0}, TYPE(FMT_2_10_10_10), // 7
{0}, {0},
{0}, {0},
TYPE(FMT_8_8), // 10 TYPE(FMT_8_8), // 10

View File

@ -232,12 +232,12 @@ struct {
INSTR(KILLONEs, 1), // 39 INSTR(KILLONEs, 1), // 39
INSTR(SQRT_IEEE, 1), // 40 INSTR(SQRT_IEEE, 1), // 40
{0, 0}, {0, 0},
INSTR(MUL_CONST_0, 1), // 42 INSTR(MUL_CONST_0, 2), // 42
INSTR(MUL_CONST_1, 1), // 43 INSTR(MUL_CONST_1, 2), // 43
INSTR(ADD_CONST_0, 1), // 44 INSTR(ADD_CONST_0, 2), // 44
INSTR(ADD_CONST_1, 1), // 45 INSTR(ADD_CONST_1, 2), // 45
INSTR(SUB_CONST_0, 1), // 46 INSTR(SUB_CONST_0, 2), // 46
INSTR(SUB_CONST_1, 1), // 47 INSTR(SUB_CONST_1, 2), // 47
INSTR(SIN, 1), // 48 INSTR(SIN, 1), // 48
INSTR(COS, 1), // 49 INSTR(COS, 1), // 49
INSTR(RETAIN_PREV, 1), // 50 INSTR(RETAIN_PREV, 1), // 50
@ -342,7 +342,7 @@ struct {
{0}, {0},
{0}, {0},
TYPE(FMT_8_8_8_8), // 6 TYPE(FMT_8_8_8_8), // 6
{0}, TYPE(FMT_2_10_10_10), // 7
{0}, {0},
{0}, {0},
TYPE(FMT_8_8), // 10 TYPE(FMT_8_8), // 10