From 55d6646fc3be1cc5e5c51a7f92c9cc50d2ee44ee Mon Sep 17 00:00:00 2001 From: Tony Wasserka Date: Wed, 26 Jun 2013 21:12:40 +0200 Subject: [PATCH] softgpu: Add something like rectangle support. Doesn't seem to work :/ --- GPU/Software/Clipper.cpp | 11 +++++++++++ GPU/Software/Clipper.h | 1 + GPU/Software/SoftGpu.cpp | 3 ++- GPU/Software/TransformUnit.cpp | 25 +++++++++++++++++++++---- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/GPU/Software/Clipper.cpp b/GPU/Software/Clipper.cpp index adcc1543c8..6d6661b43f 100644 --- a/GPU/Software/Clipper.cpp +++ b/GPU/Software/Clipper.cpp @@ -95,6 +95,17 @@ static inline int CalcClipMask(const ClipCoords& v) } \ } +void ProcessQuad(VertexData* data) +{ + // TODO: Clipping + + VertexData verts[6] = { data[0], data[0], data[1], data[1], data[0], data[0] }; + verts[1].drawpos.x = data[1].drawpos.x; + verts[4].drawpos.x = data[0].drawpos.x; + Rasterizer::DrawTriangle(data); + Rasterizer::DrawTriangle(data+3); +} + void ProcessTriangle(VertexData* data) { enum { NUM_CLIPPED_VERTICES = 33, NUM_INDICES = NUM_CLIPPED_VERTICES + 3 }; diff --git a/GPU/Software/Clipper.h b/GPU/Software/Clipper.h index c8f84efd77..3cf3148269 100644 --- a/GPU/Software/Clipper.h +++ b/GPU/Software/Clipper.h @@ -22,5 +22,6 @@ namespace Clipper { void ProcessTriangle(VertexData* data); +void ProcessQuad(VertexData* data); } diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index c840195109..003066d209 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -255,7 +255,7 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) "TRIANGLE_FAN=5,", "RECTANGLES=6,", }; - if (type != 3) + if (type != GE_PRIM_TRIANGLES && type != GE_PRIM_RECTANGLES) 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); @@ -269,6 +269,7 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) { // TODO: through mode support... ERROR_LOG(G3D, "Using through mode... fail"); + break; } TransformUnit::SubmitPrimitive(verts, type, count, gstate.vertType); diff --git a/GPU/Software/TransformUnit.cpp b/GPU/Software/TransformUnit.cpp index 5135805de5..5bd5559ce4 100644 --- a/GPU/Software/TransformUnit.cpp +++ b/GPU/Software/TransformUnit.cpp @@ -72,17 +72,26 @@ void TransformUnit::SubmitPrimitive(void* vertices, u32 prim_type, int vertex_co vdecoder.SetVertexType(vertex_type); const DecVtxFormat& vtxfmt = vdecoder.GetDecVtxFmt(); - static u8 buf[102400]; // yolo + static u8 buf[1024000]; // yolo vdecoder.DecodeVerts(buf, vertices, 0, vertex_count - 1); VertexReader vreader(buf, vtxfmt, vertex_type); + int vtcs_per_prim = 0; + if (prim_type == GE_PRIM_POINTS) vtcs_per_prim = 1; + else if (prim_type == GE_PRIM_LINES) vtcs_per_prim = 2; + else if (prim_type == GE_PRIM_TRIANGLES) vtcs_per_prim = 3; + else if (prim_type == GE_PRIM_RECTANGLES) vtcs_per_prim = 2; + else { + // TODO: Unsupported + } + // We only support triangle lists, for now. - for (int vtx = 0; vtx < vertex_count; vtx+=3) + for (int vtx = 0; vtx < vertex_count; vtx += vtcs_per_prim) { VertexData data[3]; - for (unsigned int i = 0; i < 3; ++i) + for (unsigned int i = 0; i < vtcs_per_prim; ++i) { float pos[3]; vreader.Goto(vtx+i); @@ -102,6 +111,14 @@ void TransformUnit::SubmitPrimitive(void* vertices, u32 prim_type, int vertex_co // TODO: Should do lighting here! - Clipper::ProcessTriangle(data); + switch (prim_type) { + case GE_PRIM_TRIANGLES: + Clipper::ProcessTriangle(data); + break; + + case GE_PRIM_RECTANGLES: + Clipper::ProcessQuad(data); + break; + } } }