mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Assorted cleanup
This commit is contained in:
parent
63b9140ebf
commit
542f9f9ef1
7 changed files with 23 additions and 100 deletions
|
@ -222,7 +222,7 @@ public:
|
|||
bool NotifyBlockTransferBefore(u32 dstBasePtr, int dstStride, int dstX, int dstY, u32 srcBasePtr, int srcStride, int srcX, int srcY, int w, int h, int bpp, u32 skipDrawReason);
|
||||
void NotifyBlockTransferAfter(u32 dstBasePtr, int dstStride, int dstX, int dstY, u32 srcBasePtr, int srcStride, int srcX, int srcY, int w, int h, int bpp, u32 skipDrawReason);
|
||||
|
||||
virtual void ReadFramebufferToMemory(VirtualFramebuffer *vfb, bool sync, int x, int y, int w, int h);
|
||||
void ReadFramebufferToMemory(VirtualFramebuffer *vfb, bool sync, int x, int y, int w, int h);
|
||||
|
||||
void DownloadFramebufferForClut(u32 fb_address, u32 loadBytes);
|
||||
void DrawFramebufferToOutput(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, bool applyPostShader);
|
||||
|
|
|
@ -156,7 +156,7 @@ void DrawEngineGLES::DeviceRestore() {
|
|||
void DrawEngineGLES::InitDeviceObjects() {
|
||||
for (int i = 0; i < GLRenderManager::MAX_INFLIGHT_FRAMES; i++) {
|
||||
frameData_[i].pushVertex = new GLPushBuffer(render_, GL_ARRAY_BUFFER, 1024 * 1024);
|
||||
frameData_[i].pushIndex = new GLPushBuffer(render_, GL_ELEMENT_ARRAY_BUFFER, 512 * 1024);
|
||||
frameData_[i].pushIndex = new GLPushBuffer(render_, GL_ELEMENT_ARRAY_BUFFER, 256 * 1024);
|
||||
}
|
||||
|
||||
int vertexSize = sizeof(TransformedVertex);
|
||||
|
|
|
@ -519,21 +519,6 @@ void FramebufferManagerGLES::BindFramebufferAsColorTexture(int stage, VirtualFra
|
|||
}
|
||||
}
|
||||
|
||||
void FramebufferManagerGLES::ReadFramebufferToMemory(VirtualFramebuffer *vfb, bool sync, int x, int y, int w, int h) {
|
||||
PROFILE_THIS_SCOPE("gpu-readback");
|
||||
if (vfb) {
|
||||
// We'll pseudo-blit framebuffers here to get a resized version of vfb.
|
||||
VirtualFramebuffer *nvfb = FindDownloadTempBuffer(vfb);
|
||||
OptimizeDownloadRange(vfb, x, y, w, h);
|
||||
BlitFramebuffer(nvfb, x, y, vfb, x, y, w, h, 0);
|
||||
|
||||
PackFramebufferSync_(nvfb, x, y, w, h);
|
||||
|
||||
textureCacheGL_->ForgetLastTexture();
|
||||
RebindFramebuffer();
|
||||
}
|
||||
}
|
||||
|
||||
bool FramebufferManagerGLES::CreateDownloadTempBuffer(VirtualFramebuffer *nvfb) {
|
||||
// When updating VRAM, it need to be exact format.
|
||||
if (!gstate_c.Supports(GPU_PREFER_CPU_DOWNLOAD)) {
|
||||
|
@ -568,8 +553,6 @@ void FramebufferManagerGLES::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb)
|
|||
// Discard the previous contents of this buffer where possible.
|
||||
if (gl_extensions.GLES3 && glInvalidateFramebuffer != nullptr) {
|
||||
draw_->BindFramebufferAsRenderTarget(nvfb->fbo, { Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE });
|
||||
GLenum attachments[3] = { GL_COLOR_ATTACHMENT0, GL_STENCIL_ATTACHMENT, GL_DEPTH_ATTACHMENT };
|
||||
glInvalidateFramebuffer(GL_FRAMEBUFFER, 3, attachments);
|
||||
} else if (gl_extensions.IsGLES) {
|
||||
draw_->BindFramebufferAsRenderTarget(nvfb->fbo, { Draw::RPAction::CLEAR, Draw::RPAction::CLEAR, Draw::RPAction::CLEAR });
|
||||
}
|
||||
|
@ -712,57 +695,6 @@ void ConvertFromRGBA8888(u8 *dst, const u8 *src, u32 dstStride, u32 srcStride, u
|
|||
}
|
||||
}
|
||||
|
||||
void FramebufferManagerGLES::PackFramebufferSync_(VirtualFramebuffer *vfb, int x, int y, int w, int h) {
|
||||
if (!vfb->fbo) {
|
||||
ERROR_LOG_REPORT_ONCE(vfbfbozero, SCEGE, "PackFramebufferSync_: vfb->fbo == 0");
|
||||
return;
|
||||
}
|
||||
|
||||
int possibleH = std::max(vfb->height - y, 0);
|
||||
if (h > possibleH) {
|
||||
h = possibleH;
|
||||
}
|
||||
|
||||
bool convert = vfb->format != GE_FORMAT_8888;
|
||||
const int dstBpp = vfb->format == GE_FORMAT_8888 ? 4 : 2;
|
||||
const int packWidth = std::min(vfb->fb_stride, std::min(x + w, (int)vfb->width));
|
||||
|
||||
// Pixel size always 4 here because we always request RGBA8888
|
||||
u32 bufSize = packWidth * h * 4;
|
||||
u32 fb_address = 0x04000000 | vfb->fb_address;
|
||||
|
||||
if (gl_extensions.IsGLES && !gl_extensions.GLES3 && packWidth != vfb->fb_stride && h != 1) {
|
||||
// Need to use a temp buffer, since GLES2 doesn't support GL_PACK_ROW_LENGTH.
|
||||
convert = true;
|
||||
}
|
||||
|
||||
int dstByteOffset = y * vfb->fb_stride * dstBpp;
|
||||
u8 *dst = Memory::GetPointer(fb_address + dstByteOffset);
|
||||
|
||||
u8 *packed = nullptr;
|
||||
if (!convert) {
|
||||
packed = (u8 *)dst;
|
||||
} else {
|
||||
// End result may be 16-bit but we are reading 32-bit, so there may not be enough space at fb_address
|
||||
if (!convBuf_ || convBufSize_ < bufSize) {
|
||||
delete [] convBuf_;
|
||||
convBuf_ = new u8[bufSize];
|
||||
convBufSize_ = bufSize;
|
||||
}
|
||||
packed = convBuf_;
|
||||
}
|
||||
|
||||
if (packed) {
|
||||
DEBUG_LOG(FRAMEBUF, "Reading framebuffer to mem, bufSize = %u, fb_address = %08x", bufSize, fb_address);
|
||||
// Avoid reading the part between width and stride, if possible.
|
||||
int packStride = convert || h == 1 ? packWidth : vfb->fb_stride;
|
||||
draw_->CopyFramebufferToMemorySync(vfb->fbo, Draw::FB_COLOR_BIT, 0, y, packWidth, h, Draw::DataFormat::R8G8B8A8_UNORM, packed, packStride);
|
||||
if (convert) {
|
||||
ConvertFromRGBA8888(dst, packed, vfb->fb_stride, packStride, packWidth, h, vfb->format);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FramebufferManagerGLES::PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h) {
|
||||
if (!vfb->fbo) {
|
||||
ERROR_LOG_REPORT_ONCE(vfbfbozero, SCEGE, "PackDepthbuffer: vfb->fbo == 0");
|
||||
|
|
|
@ -61,9 +61,6 @@ public:
|
|||
// For use when texturing from a framebuffer. May create a duplicate if target.
|
||||
void BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags);
|
||||
|
||||
// Reads a rectangular subregion of a framebuffer to the right position in its backing memory.
|
||||
void ReadFramebufferToMemory(VirtualFramebuffer *vfb, bool sync, int x, int y, int w, int h) override;
|
||||
|
||||
bool NotifyStencilUpload(u32 addr, int size, bool skipZero = false) override;
|
||||
|
||||
bool GetOutputFramebuffer(GPUDebugBuffer &buffer) override;
|
||||
|
@ -90,7 +87,6 @@ private:
|
|||
void CompileDraw2DProgram();
|
||||
void CompilePostShader();
|
||||
|
||||
void PackFramebufferSync_(VirtualFramebuffer *vfb, int x, int y, int w, int h) override;
|
||||
void PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h);
|
||||
|
||||
GLRenderManager *render_;
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
|
||||
void WindowsGLContext::SwapBuffers() {
|
||||
::SwapBuffers(hDC);
|
||||
|
||||
// Used during fullscreen switching to prevent rendering.
|
||||
if (pauseRequested) {
|
||||
SetEvent(pauseEvent);
|
||||
|
@ -46,10 +45,6 @@ void WindowsGLContext::SwapBuffers() {
|
|||
}
|
||||
pauseRequested = false;
|
||||
}
|
||||
|
||||
// According to some sources, doing this *after* swapbuffers can reduce frame latency
|
||||
// at a large performance cost. So let's not.
|
||||
// glFinish();
|
||||
}
|
||||
|
||||
void WindowsGLContext::Pause() {
|
||||
|
@ -96,7 +91,7 @@ void FormatDebugOutputARB(char outStr[], size_t outStrSize, GLenum source, GLenu
|
|||
case GL_DEBUG_SOURCE_APPLICATION_ARB: sourceFmt = "APPLICATION"; break;
|
||||
case GL_DEBUG_SOURCE_OTHER_ARB: sourceFmt = "OTHER"; break;
|
||||
}
|
||||
_snprintf(sourceStr, 32, sourceFmt, source);
|
||||
snprintf(sourceStr, sizeof(sourceStr), sourceFmt, source);
|
||||
|
||||
char typeStr[32];
|
||||
const char *typeFmt = "UNDEFINED(0x%04X)";
|
||||
|
@ -108,30 +103,27 @@ void FormatDebugOutputARB(char outStr[], size_t outStrSize, GLenum source, GLenu
|
|||
case GL_DEBUG_TYPE_PERFORMANCE_ARB: typeFmt = "PERFORMANCE"; break;
|
||||
case GL_DEBUG_TYPE_OTHER_ARB: typeFmt = "OTHER"; break;
|
||||
}
|
||||
_snprintf(typeStr, 32, typeFmt, type);
|
||||
snprintf(typeStr, sizeof(typeStr), typeFmt, type);
|
||||
|
||||
char severityStr[32];
|
||||
const char *severityFmt = "UNDEFINED";
|
||||
switch(severity)
|
||||
{
|
||||
case GL_DEBUG_SEVERITY_HIGH_ARB: severityFmt = "HIGH"; break;
|
||||
switch (severity) {
|
||||
case GL_DEBUG_SEVERITY_HIGH_ARB: severityFmt = "HIGH"; break;
|
||||
case GL_DEBUG_SEVERITY_MEDIUM_ARB: severityFmt = "MEDIUM"; break;
|
||||
case GL_DEBUG_SEVERITY_LOW_ARB: severityFmt = "LOW"; break;
|
||||
}
|
||||
|
||||
_snprintf(severityStr, 32, severityFmt, severity);
|
||||
|
||||
_snprintf(outStr, outStrSize, "OpenGL: %s [source=%s type=%s severity=%s id=%d]\n", msg, sourceStr, typeStr, severityStr, id);
|
||||
snprintf(severityStr, sizeof(severityStr), severityFmt, severity);
|
||||
snprintf(outStr, sizeof(outStr), "OpenGL: %s [source=%s type=%s severity=%s id=%d]\n", msg, sourceStr, typeStr, severityStr, id);
|
||||
}
|
||||
|
||||
void DebugCallbackARB(GLenum source, GLenum type, GLuint id, GLenum severity,
|
||||
GLsizei length, const GLchar *message, GLvoid *userParam) {
|
||||
(void)length;
|
||||
FILE *outFile = (FILE*)userParam;
|
||||
FILE *outFile = (FILE *)userParam;
|
||||
char finalMessage[256];
|
||||
FormatDebugOutputARB(finalMessage, 256, source, type, id, severity, message);
|
||||
OutputDebugStringA(finalMessage);
|
||||
|
||||
switch (type) {
|
||||
case GL_DEBUG_TYPE_ERROR_ARB:
|
||||
case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB:
|
||||
|
@ -153,6 +145,7 @@ void DebugCallbackARB(GLenum source, GLenum type, GLuint id, GLenum severity,
|
|||
|
||||
bool WindowsGLContext::Init(HINSTANCE hInst, HWND window, std::string *error_message) {
|
||||
glslang::InitializeProcess();
|
||||
|
||||
*error_message = "ok";
|
||||
hWnd = window;
|
||||
GLuint PixelFormat;
|
||||
|
@ -186,7 +179,7 @@ bool WindowsGLContext::Init(HINSTANCE hInst, HWND window, std::string *error_mes
|
|||
return false; // Return FALSE
|
||||
}
|
||||
|
||||
if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd))) {
|
||||
if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd))) {
|
||||
*error_message = "Can't find a suitable PixelFormat.";
|
||||
return false;
|
||||
}
|
||||
|
@ -196,7 +189,7 @@ bool WindowsGLContext::Init(HINSTANCE hInst, HWND window, std::string *error_mes
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!(hRC = wglCreateContext(hDC))) {
|
||||
if (!(hRC = wglCreateContext(hDC))) {
|
||||
*error_message = "Can't create a GL rendering context.";
|
||||
return false;
|
||||
}
|
||||
|
@ -225,7 +218,7 @@ bool WindowsGLContext::Init(HINSTANCE hInst, HWND window, std::string *error_mes
|
|||
HDC dc = GetDC(NULL);
|
||||
u32 colour_depth = GetDeviceCaps(dc, BITSPIXEL);
|
||||
ReleaseDC(NULL, dc);
|
||||
if (colour_depth != 32){
|
||||
if (colour_depth != 32) {
|
||||
MessageBox(0, L"Please switch your display to 32-bit colour mode", L"OpenGL Error", MB_OK);
|
||||
ExitProcess(1);
|
||||
}
|
||||
|
@ -383,12 +376,12 @@ void WindowsGLContext::Shutdown() {
|
|||
if (hRC) {
|
||||
// Are we able to release the DC and RC contexts?
|
||||
if (!wglMakeCurrent(NULL,NULL)) {
|
||||
MessageBox(NULL,L"Release of DC and RC failed.", L"SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
|
||||
MessageBox(NULL, L"Release of DC and RC failed.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);
|
||||
}
|
||||
|
||||
// Are we able to delete the RC?
|
||||
if (!wglDeleteContext(hRC)) {
|
||||
MessageBox(NULL,L"Release rendering context failed.", L"SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
|
||||
MessageBox(NULL, L"Release rendering context failed.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);
|
||||
}
|
||||
hRC = NULL;
|
||||
}
|
||||
|
@ -396,7 +389,7 @@ void WindowsGLContext::Shutdown() {
|
|||
if (hDC && !ReleaseDC(hWnd,hDC)) {
|
||||
DWORD err = GetLastError();
|
||||
if (err != ERROR_DC_NOT_FOUND) {
|
||||
MessageBox(NULL,L"Release device context failed.", L"SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
|
||||
MessageBox(NULL, L"Release device context failed.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);
|
||||
}
|
||||
hDC = NULL;
|
||||
}
|
||||
|
|
|
@ -919,11 +919,6 @@ void GLQueueRunner::fbo_ext_create(const GLRInitStep &step) {
|
|||
|
||||
// Create the surfaces.
|
||||
glBindTexture(GL_TEXTURE_2D, fbo->color_texture);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fbo->width, fbo->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
|
|
|
@ -15,21 +15,27 @@ void GLDeleter::Perform() {
|
|||
for (auto shader : shaders) {
|
||||
delete shader;
|
||||
}
|
||||
shaders.clear();
|
||||
for (auto program : programs) {
|
||||
delete program;
|
||||
}
|
||||
programs.clear();
|
||||
for (auto buffer : buffers) {
|
||||
delete buffer;
|
||||
}
|
||||
buffers.clear();
|
||||
for (auto texture : textures) {
|
||||
delete texture;
|
||||
}
|
||||
textures.clear();
|
||||
for (auto inputLayout : inputLayouts) {
|
||||
delete inputLayout;
|
||||
}
|
||||
inputLayouts.clear();
|
||||
for (auto framebuffer : framebuffers) {
|
||||
delete framebuffer;
|
||||
}
|
||||
framebuffers.clear();
|
||||
}
|
||||
|
||||
GLRenderManager::GLRenderManager() {
|
||||
|
@ -46,6 +52,7 @@ GLRenderManager::~GLRenderManager() {
|
|||
for (int i = 0; i < MAX_INFLIGHT_FRAMES; i++) {
|
||||
|
||||
}
|
||||
|
||||
if (!useThread_) {
|
||||
queueRunner_.DestroyDeviceObjects();
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue