From 40cdabeb7d33dd92dd050d0f5157a19ee8f75ffb Mon Sep 17 00:00:00 2001 From: Tony Wasserka Date: Tue, 25 Jun 2013 11:53:45 +0200 Subject: [PATCH] softgpu: Add vertex position transformation code. Seems to be doing something, even though it's not the right thing :/ --- GPU/Software/SoftGpu.cpp | 37 +++++++++++++++++++++++++++++----- GPU/Software/TransformUnit.cpp | 18 +++++++++++------ GPU/Software/TransformUnit.h | 11 +++++----- 3 files changed, 50 insertions(+), 16 deletions(-) diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index 18996fa196..f2fcc66722 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -16,7 +16,6 @@ // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. -#include "SoftGpu.h" #include "../GPUState.h" #include "../ge_constants.h" #include "../../Core/MemMap.h" @@ -25,6 +24,9 @@ #include "../GLES/VertexDecoder.h" #include "gfx/gl_common.h" +#include "SoftGpu.h" +#include "TransformUnit.h" + static GLuint temp_texture = 0; static GLint attr_pos = -1, attr_tex = -1; @@ -32,7 +34,9 @@ static GLint uni_tex = -1; static GLuint program; -u8 fb_dummy[480*272*4]; // TODO: Should replace this one with the actual framebuffer +#define FB_WIDTH 480 +#define FB_HEIGHT 272 +u8 fb_dummy[FB_WIDTH*FB_HEIGHT*4]; // TODO: Should replace this one with the actual framebuffer u8* fb = fb_dummy; GLuint OpenGL_CompileProgram(const char* vertexShader, const char* fragmentShader) @@ -187,7 +191,11 @@ void SoftGPU::CopyDisplayToOutput() // for (unsigned int i = 0; i < sizeof(fb_dummy); ++i) // fb_dummy[i] = ((i%4)==2) ? i*255/sizeof(fb_dummy) : 0xff; - CopyToCurrentFboFromRam(fb, 480, 272, PSP_CoreParameter().renderWidth, PSP_CoreParameter().renderHeight); + CopyToCurrentFboFromRam(fb, FB_WIDTH, FB_HEIGHT, PSP_CoreParameter().renderWidth, PSP_CoreParameter().renderHeight); + + // dummy clear + for (unsigned int i = 0; i < sizeof(fb_dummy); ++i) + fb_dummy[i] = 0; } u32 SoftGPU::DrawSync(int mode) @@ -248,7 +256,10 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) "TRIANGLE_FAN=5,", "RECTANGLES=6,", }; - DEBUG_LOG(G3D, "DL DrawPrim type: %s count: %i vaddr= %08x, iaddr= %08x", type<7 ? types[type] : "INVALID", count, gstate_c.vertexAddr, gstate_c.indexAddr); + if (type != 3) + break; + + ERROR_LOG(G3D, "DL DrawPrim type: %s count: %i vaddr= %08x, iaddr= %08x", type<7 ? types[type] : "INVALID", count, gstate_c.vertexAddr, gstate_c.indexAddr); void *verts = Memory::GetPointer(gstate_c.vertexAddr); if ((gstate.vertType & GE_VTYPE_IDX_MASK) != GE_VTYPE_IDX_NONE) { @@ -264,7 +275,23 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) vdecoder.DecodeVerts(buf, verts, 0, count - 1); VertexReader vreader(buf, vtxfmt, gstate.vertType); - PrintDecodedVertex(vreader); + + for (int vtx = 0; vtx < count; ++vtx) + { + vreader.Goto(vtx); + + float pos[3]; + vreader.ReadPos(pos); + + ModelCoords mcoords(pos[0], pos[1], pos[2]); + DrawingCoords dcoords(TransformUnit::ScreenToDrawing(TransformUnit::ClipToScreen(TransformUnit::ViewToClip(TransformUnit::WorldToView(TransformUnit::ModelToWorld(mcoords)))))); + if (dcoords.x >= FB_WIDTH) break; + if (dcoords.y >= FB_HEIGHT) break; + fb_dummy[dcoords.x*4 + dcoords.y * FB_WIDTH * 4] = 0xff; + fb_dummy[dcoords.x*4 + dcoords.y * FB_WIDTH * 4+1] = 0xff; + fb_dummy[dcoords.x*4 + dcoords.y * FB_WIDTH * 4+2] = 0xff; + fb_dummy[dcoords.x*4 + dcoords.y * FB_WIDTH * 4+3] = 0xff; + } } break; diff --git a/GPU/Software/TransformUnit.cpp b/GPU/Software/TransformUnit.cpp index e37ff5b295..e8245b9811 100644 --- a/GPU/Software/TransformUnit.cpp +++ b/GPU/Software/TransformUnit.cpp @@ -40,14 +40,20 @@ ClipCoords TransformUnit::ViewToClip(const ViewCoords& coords) ScreenCoords TransformUnit::ClipToScreen(const ClipCoords& coords) { ScreenCoords ret; - float viewport_dx = gstate.viewportx2 - gstate.viewportx1; // TODO: -1? - float viewport_dy = gstate.viewporty2 - gstate.viewporty1; // TODO: -1? - float viewport_dz = gstate.viewportz2 - gstate.viewportz1; // TODO: -1? + float vpx1 = getFloat24(gstate.viewportx1); + float vpx2 = getFloat24(gstate.viewportx2); + float vpy1 = getFloat24(gstate.viewporty1); + float vpy2 = getFloat24(gstate.viewporty2); + float vpz1 = getFloat24(gstate.viewportz1); + float vpz2 = getFloat24(gstate.viewportz2); + float viewport_dx = vpx2 - vpx1; // TODO: -1? + float viewport_dy = vpy2 - vpy1; // TODO: -1? + float viewport_dz = vpz2 - vpz1; // TODO: -1? // TODO: Check for invalid parameters (x2 < x1, etc) - ret.x = (coords.x * viewport_dx / coords.w + gstate.viewportx1) * 0xFFFF; - ret.y = (coords.y * viewport_dy / coords.w + gstate.viewporty1) * 0xFFFF; - ret.z = (coords.z * viewport_dz / coords.w + gstate.viewportz1) * 0xFFFF; + ret.x = (coords.x * viewport_dx / coords.w + vpx1) * 0xFFFF; + ret.y = (coords.y * viewport_dy / coords.w + vpy1) * 0xFFFF; + ret.z = (coords.z * viewport_dz / coords.w + vpz1) * 0xFFFF; return ret; } diff --git a/GPU/Software/TransformUnit.h b/GPU/Software/TransformUnit.h index 7e6f9ae6e7..69dc7c60c1 100644 --- a/GPU/Software/TransformUnit.h +++ b/GPU/Software/TransformUnit.h @@ -39,9 +39,10 @@ typedef Vec2 DrawingCoords; // TODO: Keep z component? class TransformUnit { - WorldCoords ModelToWorld(const ModelCoords& coords); - ViewCoords WorldToView(const WorldCoords& coords); - ClipCoords ViewToClip(const ViewCoords& coords); - ScreenCoords ClipToScreen(const ClipCoords& coords); - DrawingCoords ScreenToDrawing(const ScreenCoords& coords); +public: + static WorldCoords ModelToWorld(const ModelCoords& coords); + static ViewCoords WorldToView(const WorldCoords& coords); + static ClipCoords ViewToClip(const ViewCoords& coords); + static ScreenCoords ClipToScreen(const ClipCoords& coords); + static DrawingCoords ScreenToDrawing(const ScreenCoords& coords); };