[PICA] Fixed vertex attribute uploads

This commit is contained in:
wheremyfoodat 2022-09-23 02:19:23 +03:00
parent a86796936f
commit 4b3c7955dd
6 changed files with 60 additions and 9 deletions

View file

@ -7,8 +7,18 @@ using namespace Floats;
GPU::GPU(Memory& mem) : mem(mem) {
vram = new u8[vramSize];
}
void GPU::reset() {
regs.fill(0);
shaderUnit.reset();
std::memset(vram, 0, vramSize);
totalAttribCount = 0;
fixedAttribMask = 0;
fixedAttribIndex = 0;
fixedAttribCount = 0;
fixedAttrBuff.fill(0);
for (auto& e : attributeInfo) {
e.offset = 0;
@ -16,12 +26,7 @@ GPU::GPU(Memory& mem) : mem(mem) {
e.config1 = 0;
e.config2 = 0;
}
}
void GPU::reset() {
regs.fill(0);
shaderUnit.reset();
std::memset(vram, 0, vramSize);
// TODO: Reset blending, texturing, etc here
}

View file

@ -1,6 +1,8 @@
#include "PICA/gpu.hpp"
#include "PICA/regs.hpp"
using namespace Floats;
u32 GPU::readReg(u32 address) {
printf("Ignoring read from GPU register %08X\n", address);
return 0;
@ -52,6 +54,34 @@ void GPU::writeInternalReg(u32 index, u32 value, u32 mask) {
fixedAttribMask = (value >> 16) & 0xfff; // Determines which vertex attributes are fixed for all vertices
break;
case FixedAttribIndex:
fixedAttribCount = 0;
fixedAttribIndex = value & 0xf;
if (fixedAttribIndex == 0xf) Helpers::panic("[PICA] Immediate mode vertex submission");
break;
case FixedAttribData0: case FixedAttribData1: case FixedAttribData2:
if (fixedAttribIndex >= 12) Helpers::panic("[PICA] Tried to write to fixed attribute %d", fixedAttribIndex);
fixedAttrBuff[fixedAttribCount++] = value;
if (fixedAttribCount == 3) {
fixedAttribCount = 0;
vec4f& attr = shaderUnit.vs.fixedAttributes[fixedAttribIndex];
// These are stored in the reverse order anyone would expect them to be in
attr.x() = f24::fromRaw(fixedAttrBuff[2] & 0xffffff);
attr.y() = f24::fromRaw(((fixedAttrBuff[1] & 0xffff) << 8) | (fixedAttrBuff[2] >> 24));
attr.z() = f24::fromRaw(((fixedAttrBuff[0] & 0xff) << 16) | (fixedAttrBuff[1] >> 16));
attr.w() = f24::fromRaw(fixedAttrBuff[0] >> 8);
printf("r: %f g: %f b: %f a: %f\n", (double)attr.r().toFloat32(), (double)attr.g().toFloat32(), (double)attr.b().toFloat32(), (double)attr.a().toFloat32());
fixedAttribIndex++;
}
break;
case VertexShaderTransferEnd:
if (value != 0) shaderUnit.vs.finalize();
break;