mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-04-20 20:49:12 +12:00
[PICA] Fixed vertex attribute uploads
This commit is contained in:
parent
a86796936f
commit
4b3c7955dd
6 changed files with 60 additions and 9 deletions
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue