From 5c2d418d95beddb9f5e9c2abc15bcc4fa9a1cf0e Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 7 Oct 2013 01:02:58 -0700 Subject: [PATCH] Read softgpu stencil using existing funcs. Slower but at least it's the same. --- GPU/Software/Rasterizer.cpp | 14 ++++++++++++++ GPU/Software/Rasterizer.h | 4 ++++ GPU/Software/SoftGpu.cpp | 35 ++++++----------------------------- 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/GPU/Software/Rasterizer.cpp b/GPU/Software/Rasterizer.cpp index fc06734a85..c79231f014 100644 --- a/GPU/Software/Rasterizer.cpp +++ b/GPU/Software/Rasterizer.cpp @@ -959,4 +959,18 @@ void DrawTriangle(const VertexData& v0, const VertexData& v1, const VertexData& } } +bool GetCurrentStencilbuffer(GPUDebugBuffer &buffer) +{ + buffer.Allocate(gstate.DepthBufStride(), 512, GPU_DBG_FORMAT_8BIT); + + u8 *row = buffer.GetData(); + for (int y = 0; y < 512; ++y) { + for (int x = 0; x < gstate.DepthBufStride(); ++x) { + row[x] = GetPixelStencil(x, y); + } + row += gstate.DepthBufStride(); + } + return true; +} + } // namespace diff --git a/GPU/Software/Rasterizer.h b/GPU/Software/Rasterizer.h index e49767e187..7f06222fc7 100644 --- a/GPU/Software/Rasterizer.h +++ b/GPU/Software/Rasterizer.h @@ -19,9 +19,13 @@ #include "TransformUnit.h" // for DrawingCoords +struct GPUDebugBuffer; + namespace Rasterizer { // Draws a triangle if its vertices are specified in counter-clockwise order void DrawTriangle(const VertexData& v0, const VertexData& v1, const VertexData& v2); +bool GetCurrentStencilbuffer(GPUDebugBuffer &buffer); + } diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index 2c3388a552..9e02ca7c3c 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -28,6 +28,7 @@ #include "GPU/Software/SoftGpu.h" #include "GPU/Software/TransformUnit.h" #include "GPU/Software/Colors.h" +#include "GPU/Software/Rasterizer.h" static GLuint temp_texture = 0; @@ -765,40 +766,15 @@ bool SoftGPU::GetCurrentDepthbuffer(GPUDebugBuffer &buffer) bool SoftGPU::GetCurrentStencilbuffer(GPUDebugBuffer &buffer) { - buffer.Allocate(gstate.DepthBufStride(), 512, GPU_DBG_FORMAT_8BIT); - - for (int y = 0; y < 512; ++y) { - u8 *row = buffer.GetData() + gstate.DepthBufStride() * y; - switch (gstate.FrameBufFormat()) { - case GE_FORMAT_565: - memset(row, 0, gstate.DepthBufStride()); - break; - case GE_FORMAT_5551: - for (int x = 0; x < gstate.DepthBufStride(); ++x) { - row[x] = (fb.Get16(x, y, gstate.FrameBufStride()) & 0x8000) != 0 ? 0xFF : 0; - } - break; - case GE_FORMAT_4444: - for (int x = 0; x < gstate.DepthBufStride(); ++x) { - row[x] = Convert4To8(fb.Get16(x, y, gstate.FrameBufStride()) >> 12); - } - break; - case GE_FORMAT_8888: - for (int x = 0; x < gstate.DepthBufStride(); ++x) { - row[x] = fb.Get32(x, y, gstate.FrameBufStride()) >> 24; - } - break; - case GE_FORMAT_INVALID: - ERROR_LOG(HLE, "Impossible framebuffer format."); - break; - } - } - return true; + return Rasterizer::GetCurrentStencilbuffer(buffer); } bool SoftGPU::GetCurrentTexture(GPUDebugBuffer &buffer) { static const int level = 0; + + WARN_LOG(G3D, "Software texture preview currently very broken."); + u32 bufw = GetTextureBufw(level, gstate.getTextureAddress(level), gstate.getTextureFormat()); switch (gstate.getTextureFormat()) { @@ -806,6 +782,7 @@ bool SoftGPU::GetCurrentTexture(GPUDebugBuffer &buffer) case GE_TFMT_5551: case GE_TFMT_4444: case GE_TFMT_8888: + // TODO: Swizzling, of course. buffer = GPUDebugBuffer(Memory::GetPointer(gstate.getTextureAddress(level)), bufw, gstate.getTextureHeight(level), gstate.getTextureFormat()); return true;