[PICA] Shader uploads

This commit is contained in:
wheremyfoodat 2022-09-22 03:46:19 +03:00
parent 36a30da78d
commit 5993dc4759
11 changed files with 105 additions and 9 deletions

View file

@ -1,8 +1,9 @@
#include "gpu.hpp"
#include "PICA/gpu.hpp"
#include <cstdio>
void GPU::reset() {
regs.fill(0);
shaderUnit.reset();
// TODO: Reset blending, texturing, etc here
}

View file

@ -1,4 +1,5 @@
#include "gpu.hpp"
#include "PICA/gpu.hpp"
#include "PICA/regs.hpp"
u32 GPU::readReg(u32 address) {
printf("Ignoring read from GPU register %08X\n", address);
@ -10,7 +11,7 @@ void GPU::writeReg(u32 address, u32 value) {
const u32 index = (address - 0x1EF01000) / sizeof(u32);
writeInternalReg(index, value, 0xffffffff);
} else {
Helpers::panic("Ignoring write to GPU register %08X. Value: %08X\n", address, value);
printf("Ignoring write to external GPU register %08X. Value: %08X\n", address, value);
}
}
@ -24,6 +25,8 @@ u32 GPU::readInternalReg(u32 index) {
}
void GPU::writeInternalReg(u32 index, u32 value, u32 mask) {
using namespace PICAInternalRegs;
if (index > regNum) {
Helpers::panic("Tried to write to invalid GPU register. Index: %X, value: %08X\n", index, value);
return;
@ -32,7 +35,22 @@ void GPU::writeInternalReg(u32 index, u32 value, u32 mask) {
u32 currentValue = regs[index];
u32 newValue = (currentValue & ~mask) | (value & mask); // Only overwrite the bits specified by "mask"
// TODO: Figure out if things like the shader index use the unmasked value or the masked one
// We currently use the unmasked value like Citra does
switch (index) {
case VertexShaderTransferEnd:
if (value != 0) shaderUnit.vs.finalize();
break;
case VertexShaderTransferIndex:
shaderUnit.vs.setBufferIndex(value);
break;
case VertexShaderData0: case VertexShaderData1: case VertexShaderData2: case VertexShaderData3:
case VertexShaderData4: case VertexShaderData5: case VertexShaderData6: case VertexShaderData7:
shaderUnit.vs.uploadWord(value);
break;
default:
printf("GPU: Wrote to unimplemented internal reg: %X, value: %08X\n", index, newValue);
break;

View file

@ -0,0 +1,6 @@
#include "PICA/shader_unit.hpp"
void ShaderUnit::reset() {
vs.reset();
gs.reset();
}