Pica/CommandProcessor: Properly implement shader load destination offset registers.
This commit is contained in:
parent
67120270f2
commit
6c26ec72a5
|
@ -25,10 +25,6 @@ static int float_regs_counter = 0;
|
||||||
|
|
||||||
static u32 uniform_write_buffer[4];
|
static u32 uniform_write_buffer[4];
|
||||||
|
|
||||||
// Used for VSLoadProgramData and VSLoadSwizzleData
|
|
||||||
static u32 vs_binary_write_offset = 0;
|
|
||||||
static u32 vs_swizzle_write_offset = 0;
|
|
||||||
|
|
||||||
static inline void WritePicaReg(u32 id, u32 value, u32 mask) {
|
static inline void WritePicaReg(u32 id, u32 value, u32 mask) {
|
||||||
|
|
||||||
if (id >= registers.NumIds())
|
if (id >= registers.NumIds())
|
||||||
|
@ -258,11 +254,6 @@ static inline void WritePicaReg(u32 id, u32 value, u32 mask) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Seems to be used to reset the write pointer for VSLoadProgramData
|
|
||||||
case PICA_REG_INDEX(vs_program.begin_load):
|
|
||||||
vs_binary_write_offset = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Load shader program code
|
// Load shader program code
|
||||||
case PICA_REG_INDEX_WORKAROUND(vs_program.set_word[0], 0x2cc):
|
case PICA_REG_INDEX_WORKAROUND(vs_program.set_word[0], 0x2cc):
|
||||||
case PICA_REG_INDEX_WORKAROUND(vs_program.set_word[1], 0x2cd):
|
case PICA_REG_INDEX_WORKAROUND(vs_program.set_word[1], 0x2cd):
|
||||||
|
@ -273,16 +264,11 @@ static inline void WritePicaReg(u32 id, u32 value, u32 mask) {
|
||||||
case PICA_REG_INDEX_WORKAROUND(vs_program.set_word[6], 0x2d2):
|
case PICA_REG_INDEX_WORKAROUND(vs_program.set_word[6], 0x2d2):
|
||||||
case PICA_REG_INDEX_WORKAROUND(vs_program.set_word[7], 0x2d3):
|
case PICA_REG_INDEX_WORKAROUND(vs_program.set_word[7], 0x2d3):
|
||||||
{
|
{
|
||||||
VertexShader::SubmitShaderMemoryChange(vs_binary_write_offset, value);
|
VertexShader::SubmitShaderMemoryChange(registers.vs_program.offset, value);
|
||||||
vs_binary_write_offset++;
|
registers.vs_program.offset++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Seems to be used to reset the write pointer for VSLoadSwizzleData
|
|
||||||
case PICA_REG_INDEX(vs_swizzle_patterns.begin_load):
|
|
||||||
vs_swizzle_write_offset = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Load swizzle pattern data
|
// Load swizzle pattern data
|
||||||
case PICA_REG_INDEX_WORKAROUND(vs_swizzle_patterns.set_word[0], 0x2d6):
|
case PICA_REG_INDEX_WORKAROUND(vs_swizzle_patterns.set_word[0], 0x2d6):
|
||||||
case PICA_REG_INDEX_WORKAROUND(vs_swizzle_patterns.set_word[1], 0x2d7):
|
case PICA_REG_INDEX_WORKAROUND(vs_swizzle_patterns.set_word[1], 0x2d7):
|
||||||
|
@ -293,8 +279,8 @@ static inline void WritePicaReg(u32 id, u32 value, u32 mask) {
|
||||||
case PICA_REG_INDEX_WORKAROUND(vs_swizzle_patterns.set_word[6], 0x2dc):
|
case PICA_REG_INDEX_WORKAROUND(vs_swizzle_patterns.set_word[6], 0x2dc):
|
||||||
case PICA_REG_INDEX_WORKAROUND(vs_swizzle_patterns.set_word[7], 0x2dd):
|
case PICA_REG_INDEX_WORKAROUND(vs_swizzle_patterns.set_word[7], 0x2dd):
|
||||||
{
|
{
|
||||||
VertexShader::SubmitSwizzleDataChange(vs_swizzle_write_offset, value);
|
VertexShader::SubmitSwizzleDataChange(registers.vs_swizzle_patterns.offset, value);
|
||||||
vs_swizzle_write_offset++;
|
registers.vs_swizzle_patterns.offset++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -678,7 +678,9 @@ struct Regs {
|
||||||
INSERT_PADDING_WORDS(0x2);
|
INSERT_PADDING_WORDS(0x2);
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
u32 begin_load;
|
// Offset of the next instruction to write code to.
|
||||||
|
// Incremented with each instruction write.
|
||||||
|
u32 offset;
|
||||||
|
|
||||||
// Writing to these registers sets the "current" word in the shader program.
|
// Writing to these registers sets the "current" word in the shader program.
|
||||||
// TODO: It's not clear how the hardware stores what the "current" word is.
|
// TODO: It's not clear how the hardware stores what the "current" word is.
|
||||||
|
@ -690,7 +692,9 @@ struct Regs {
|
||||||
// This register group is used to load an internal table of swizzling patterns,
|
// This register group is used to load an internal table of swizzling patterns,
|
||||||
// which are indexed by each shader instruction to specify vector component swizzling.
|
// which are indexed by each shader instruction to specify vector component swizzling.
|
||||||
struct {
|
struct {
|
||||||
u32 begin_load;
|
// Offset of the next swizzle pattern to write code to.
|
||||||
|
// Incremented with each instruction write.
|
||||||
|
u32 offset;
|
||||||
|
|
||||||
// Writing to these registers sets the "current" swizzle pattern in the table.
|
// Writing to these registers sets the "current" swizzle pattern in the table.
|
||||||
// TODO: It's not clear how the hardware stores what the "current" swizzle pattern is.
|
// TODO: It's not clear how the hardware stores what the "current" swizzle pattern is.
|
||||||
|
|
Reference in New Issue