Add support for 24/8 textures in the GE debugger.

This commit is contained in:
Unknown W. Brackets 2014-09-14 11:13:03 -07:00
parent bccb8dfb1e
commit fee1ab98ba
3 changed files with 66 additions and 10 deletions

View File

@ -55,6 +55,8 @@ enum GPUDebugBufferFormat {
GPU_DBG_FORMAT_FLOAT = 0x10, GPU_DBG_FORMAT_FLOAT = 0x10,
GPU_DBG_FORMAT_16BIT = 0x11, GPU_DBG_FORMAT_16BIT = 0x11,
GPU_DBG_FORMAT_8BIT = 0x12, GPU_DBG_FORMAT_8BIT = 0x12,
GPU_DBG_FORMAT_24BIT_8X = 0x13,
GPU_DBG_FORMAT_24X_8BIT = 0x14,
}; };
inline GPUDebugBufferFormat &operator |=(GPUDebugBufferFormat &lhs, const GPUDebugBufferFormat &rhs) { inline GPUDebugBufferFormat &operator |=(GPUDebugBufferFormat &lhs, const GPUDebugBufferFormat &rhs) {
@ -137,11 +139,23 @@ struct GPUDebugBuffer {
fmt_ = fmt; fmt_ = fmt;
flipped_ = flipped; flipped_ = flipped;
u32 pixelSize = 2; u32 pixelSize;
if (fmt == GPU_DBG_FORMAT_8888 || fmt == GPU_DBG_FORMAT_8888_BGRA || fmt == GPU_DBG_FORMAT_FLOAT) { switch (fmt) {
case GPU_DBG_FORMAT_8888:
case GPU_DBG_FORMAT_8888_BGRA:
case GPU_DBG_FORMAT_FLOAT:
case GPU_DBG_FORMAT_24BIT_8X:
case GPU_DBG_FORMAT_24X_8BIT:
pixelSize = 4; pixelSize = 4;
} else if (fmt == GPU_DBG_FORMAT_8BIT) { break;
case GPU_DBG_FORMAT_8BIT:
pixelSize = 1; pixelSize = 1;
break;
default:
pixelSize = 2;
break;
} }
data_ = new u8[pixelSize * stride * height]; data_ = new u8[pixelSize * stride * height];
@ -154,7 +168,11 @@ struct GPUDebugBuffer {
data_ = NULL; data_ = NULL;
} }
u8 *GetData() const { u8 *GetData() {
return data_;
}
const u8 *GetData() const {
return data_; return data_;
} }

View File

@ -67,19 +67,20 @@ static const char basic_vs[] =
"}\n"; "}\n";
SimpleGLWindow::SimpleGLWindow(HWND wnd) SimpleGLWindow::SimpleGLWindow(HWND wnd)
: hWnd_(wnd), valid_(false), drawProgram_(NULL), tex_(0), flags_(0), zoom_(false), : hWnd_(wnd), valid_(false), drawProgram_(nullptr), tex_(0), flags_(0), zoom_(false),
dragging_(false), offsetX_(0), offsetY_(0) { dragging_(false), offsetX_(0), offsetY_(0), reformatBuf_(nullptr) {
SetWindowLongPtr(wnd, GWLP_USERDATA, (LONG) this); SetWindowLongPtr(wnd, GWLP_USERDATA, (LONG) this);
} }
SimpleGLWindow::~SimpleGLWindow() { SimpleGLWindow::~SimpleGLWindow() {
if (drawProgram_ != NULL) { if (drawProgram_ != nullptr) {
glsl_destroy(drawProgram_); glsl_destroy(drawProgram_);
} }
if (tex_) { if (tex_) {
glDeleteTextures(1, &tex_); glDeleteTextures(1, &tex_);
glDeleteTextures(1, &checker_); glDeleteTextures(1, &checker_);
} }
delete [] reformatBuf_;
}; };
void SimpleGLWindow::Initialize(u32 flags) { void SimpleGLWindow::Initialize(u32 flags) {
@ -204,12 +205,13 @@ void SimpleGLWindow::DrawChecker() {
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, indices); glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, indices);
} }
void SimpleGLWindow::Draw(u8 *data, int w, int h, bool flipped, Format fmt) { void SimpleGLWindow::Draw(const u8 *data, int w, int h, bool flipped, Format fmt) {
wglMakeCurrent(hDC_, hGLRC_); wglMakeCurrent(hDC_, hGLRC_);
GLint components = GL_RGBA; GLint components = GL_RGBA;
GLint memComponents = 0; GLint memComponents = 0;
GLenum glfmt; GLenum glfmt;
const u8 *finalData = data;
if (fmt == FORMAT_8888) { if (fmt == FORMAT_8888) {
glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glfmt = GL_UNSIGNED_BYTE; glfmt = GL_UNSIGNED_BYTE;
@ -220,6 +222,15 @@ void SimpleGLWindow::Draw(u8 *data, int w, int h, bool flipped, Format fmt) {
} else if (fmt == FORMAT_FLOAT) { } else if (fmt == FORMAT_FLOAT) {
glfmt = GL_FLOAT; glfmt = GL_FLOAT;
components = GL_RED; components = GL_RED;
} else if (fmt == FORMAT_24BIT_8X) {
glfmt = GL_UNSIGNED_INT;
components = GL_RED;
finalData = Reformat(data, fmt, w * h);
} else if (fmt == FORMAT_24X_8BIT) {
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glfmt = GL_UNSIGNED_BYTE;
components = GL_RED;
finalData = Reformat(data, fmt, w * h);
} else { } else {
glPixelStorei(GL_UNPACK_ALIGNMENT, 2); glPixelStorei(GL_UNPACK_ALIGNMENT, 2);
if (fmt == FORMAT_4444) { if (fmt == FORMAT_4444) {
@ -259,7 +270,7 @@ void SimpleGLWindow::Draw(u8 *data, int w, int h, bool flipped, Format fmt) {
} }
glBindTexture(GL_TEXTURE_2D, tex_); glBindTexture(GL_TEXTURE_2D, tex_);
glTexImage2D(GL_TEXTURE_2D, 0, components, w, h, 0, memComponents, glfmt, data); glTexImage2D(GL_TEXTURE_2D, 0, components, w, h, 0, memComponents, glfmt, finalData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@ -423,6 +434,28 @@ bool SimpleGLWindow::ToggleZoom() {
return true; return true;
} }
const u8 *SimpleGLWindow::Reformat(const u8 *data, Format fmt, u32 numPixels) {
if (!reformatBuf_ || reformatBufSize_ < numPixels) {
delete [] reformatBuf_;
reformatBuf_ = new u32[numPixels];
reformatBufSize_ = numPixels;
}
const u32 *data32 = (const u32 *)data;
if (fmt == FORMAT_24BIT_8X) {
for (u32 i = 0; i < numPixels; ++i) {
reformatBuf_[i] = (data32[i] << 8) | ((data32[i] >> 16) & 0xFF);
}
} else if (fmt == FORMAT_24X_8BIT) {
u8 *buf8 = (u8 *)reformatBuf_;
for (u32 i = 0; i < numPixels; ++i) {
u32 v = (data32[i] >> 24) & 0xFF;
buf8[i] = v;
}
}
return (const u8 *)reformatBuf_;
}
SimpleGLWindow *SimpleGLWindow::GetFrom(HWND hwnd) { SimpleGLWindow *SimpleGLWindow::GetFrom(HWND hwnd) {
return (SimpleGLWindow*) GetWindowLongPtr(hwnd, GWLP_USERDATA); return (SimpleGLWindow*) GetWindowLongPtr(hwnd, GWLP_USERDATA);
} }

View File

@ -39,6 +39,8 @@ struct SimpleGLWindow {
FORMAT_FLOAT = 0x10, FORMAT_FLOAT = 0x10,
FORMAT_16BIT = 0x11, FORMAT_16BIT = 0x11,
FORMAT_8BIT = 0x12, FORMAT_8BIT = 0x12,
FORMAT_24BIT_8X = 0x13,
FORMAT_24X_8BIT = 0x14,
}; };
enum Flags { enum Flags {
@ -54,7 +56,7 @@ struct SimpleGLWindow {
~SimpleGLWindow(); ~SimpleGLWindow();
void Clear(); void Clear();
void Draw(u8 *data, int w, int h, bool flipped = false, Format = FORMAT_8888); void Draw(const u8 *data, int w, int h, bool flipped = false, Format = FORMAT_8888);
void Redraw(bool andSwap = true); void Redraw(bool andSwap = true);
void Initialize(u32 flags); void Initialize(u32 flags);
static SimpleGLWindow *GetFrom(HWND hwnd); static SimpleGLWindow *GetFrom(HWND hwnd);
@ -101,6 +103,7 @@ protected:
bool DragContinue(int mouseX, int mouseY); bool DragContinue(int mouseX, int mouseY);
bool DragEnd(int mouseX, int mouseY); bool DragEnd(int mouseX, int mouseY);
bool ToggleZoom(); bool ToggleZoom();
const u8 *Reformat(const u8 *data, Format fmt, u32 numPixels);
HWND hWnd_; HWND hWnd_;
HDC hDC_; HDC hDC_;
@ -127,4 +130,6 @@ protected:
// Offset to position the texture is drawn at. // Offset to position the texture is drawn at.
int offsetX_; int offsetX_;
int offsetY_; int offsetY_;
u32 *reformatBuf_;
u32 reformatBufSize_;
}; };