diff --git a/src/GPU.cpp b/src/GPU.cpp index 2d5834e6..3b210c1d 100644 --- a/src/GPU.cpp +++ b/src/GPU.cpp @@ -406,7 +406,10 @@ void InitRenderer(int renderer) renderer = 0; GPU3D::CurrentRenderer = std::make_unique(); } - GPU3D::CurrentRenderer = GPU3D::GLRenderer::New(); + if (renderer == renderer3D_OpenGL) + GPU3D::CurrentRenderer = GPU3D::GLRenderer::New(); + else if (renderer == renderer3D_OpenGLCompute) + GPU3D::CurrentRenderer = GPU3D::ComputeRenderer::New(); if (!GPU3D::CurrentRenderer) { // Fallback on software renderer diff --git a/src/GPU3D.h b/src/GPU3D.h index e569d4bb..59c958dd 100644 --- a/src/GPU3D.h +++ b/src/GPU3D.h @@ -158,10 +158,10 @@ public: virtual u32* GetLine(int line) = 0; virtual void SetupAccelFrame() {} + virtual void PrepareCaptureFrame() {} protected: Renderer3D(bool Accelerated); - virtual void PrepareCaptureFrame() {} }; extern int Renderer; diff --git a/src/GPU3D_Compute.cpp b/src/GPU3D_Compute.cpp index d4972774..8d500a44 100644 --- a/src/GPU3D_Compute.cpp +++ b/src/GPU3D_Compute.cpp @@ -31,11 +31,6 @@ ComputeRenderer::ComputeRenderer() : Renderer3D(true), Texcache(TexcacheOpenGLLoader()) {} -ComputeRenderer::~ComputeRenderer() -{} - - - bool ComputeRenderer::CompileShader(GLuint& shader, const std::string& source, const std::initializer_list& defines) { std::string shaderName; @@ -67,55 +62,57 @@ void blah(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,con printf("%s\n", message); } -bool ComputeRenderer::Init() +std::unique_ptr ComputeRenderer::New() { + std::unique_ptr result = std::unique_ptr(new ComputeRenderer()); + //glDebugMessageCallback(blah, NULL); //glEnable(GL_DEBUG_OUTPUT); - glGenBuffers(1, &YSpanSetupMemory); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, YSpanSetupMemory); + glGenBuffers(1, &result->YSpanSetupMemory); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, result->YSpanSetupMemory); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(SpanSetupY)*MaxYSpanSetups, nullptr, GL_DYNAMIC_DRAW); - glGenBuffers(1, &RenderPolygonMemory); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, RenderPolygonMemory); + glGenBuffers(1, &result->RenderPolygonMemory); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, result->RenderPolygonMemory); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(RenderPolygon)*2048, nullptr, GL_DYNAMIC_DRAW); - glGenBuffers(1, &XSpanSetupMemory); - glGenBuffers(1, &BinResultMemory); - glGenBuffers(1, &FinalTileMemory); - glGenBuffers(1, &YSpanIndicesTextureMemory); - glGenBuffers(tilememoryLayer_Num, TileMemory); - glGenBuffers(1, &WorkDescMemory); + glGenBuffers(1, &result->XSpanSetupMemory); + glGenBuffers(1, &result->BinResultMemory); + glGenBuffers(1, &result->FinalTileMemory); + glGenBuffers(1, &result->YSpanIndicesTextureMemory); + glGenBuffers(tilememoryLayer_Num, result->TileMemory); + glGenBuffers(1, &result->WorkDescMemory); - glGenTextures(1, &YSpanIndicesTexture); - glGenTextures(1, &LowResFramebuffer); - glBindTexture(GL_TEXTURE_2D, LowResFramebuffer); + glGenTextures(1, &result->YSpanIndicesTexture); + glGenTextures(1, &result->LowResFramebuffer); + glBindTexture(GL_TEXTURE_2D, result->LowResFramebuffer); glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8UI, 256, 192); - glGenBuffers(1, &MetaUniformMemory); - glBindBuffer(GL_UNIFORM_BUFFER, MetaUniformMemory); + glGenBuffers(1, &result->MetaUniformMemory); + glBindBuffer(GL_UNIFORM_BUFFER, result->MetaUniformMemory); glBufferData(GL_UNIFORM_BUFFER, sizeof(MetaUniform), nullptr, GL_DYNAMIC_DRAW); - glGenSamplers(9, Samplers); + glGenSamplers(9, result->Samplers); for (u32 j = 0; j < 3; j++) { for (u32 i = 0; i < 3; i++) { const GLenum translateWrapMode[3] = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT}; - glSamplerParameteri(Samplers[i+j*3], GL_TEXTURE_WRAP_S, translateWrapMode[i]); - glSamplerParameteri(Samplers[i+j*3], GL_TEXTURE_WRAP_T, translateWrapMode[j]); - glSamplerParameteri(Samplers[i+j*3], GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glSamplerParameterf(Samplers[i+j*3], GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glSamplerParameteri(result->Samplers[i+j*3], GL_TEXTURE_WRAP_S, translateWrapMode[i]); + glSamplerParameteri(result->Samplers[i+j*3], GL_TEXTURE_WRAP_T, translateWrapMode[j]); + glSamplerParameteri(result->Samplers[i+j*3], GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glSamplerParameterf(result->Samplers[i+j*3], GL_TEXTURE_MAG_FILTER, GL_NEAREST); } } - glGenBuffers(1, &PixelBuffer); - glBindBuffer(GL_PIXEL_PACK_BUFFER, PixelBuffer); + glGenBuffers(1, &result->PixelBuffer); + glBindBuffer(GL_PIXEL_PACK_BUFFER, result->PixelBuffer); glBufferData(GL_PIXEL_PACK_BUFFER, 256*192*4, NULL, GL_DYNAMIC_READ); - return true; + return result; } -void ComputeRenderer::DeInit() +ComputeRenderer::~ComputeRenderer() { Texcache.Reset(); diff --git a/src/GPU3D_Compute.h b/src/GPU3D_Compute.h index 73f840b9..b36bc18f 100644 --- a/src/GPU3D_Compute.h +++ b/src/GPU3D_Compute.h @@ -19,6 +19,8 @@ #ifndef GPU3D_COMPUTE #define GPU3D_COMPUTE +#include + #include "GPU3D.h" #include "OpenGLSupport.h" @@ -33,11 +35,9 @@ namespace GPU3D class ComputeRenderer : public Renderer3D { public: - ComputeRenderer(); + static std::unique_ptr New(); ~ComputeRenderer() override; - bool Init() override; - void DeInit() override; void Reset() override; void SetRenderSettings(GPU::RenderSettings& settings) override; @@ -51,6 +51,8 @@ public: void SetupAccelFrame() override; void PrepareCaptureFrame() override; private: + ComputeRenderer(); + GLuint ShaderInterpXSpans[2]; GLuint ShaderBinCombined; GLuint ShaderDepthBlend[2]; diff --git a/src/GPU3D_OpenGL.h b/src/GPU3D_OpenGL.h index 9337d44a..e487e844 100644 --- a/src/GPU3D_OpenGL.h +++ b/src/GPU3D_OpenGL.h @@ -38,8 +38,6 @@ public: virtual u32* GetLine(int line) override; void SetupAccelFrame() override; - void PrepareCaptureFrame(); - void PrepareCaptureFrame() override; static std::unique_ptr New() noexcept; diff --git a/src/OpenGLSupport.cpp b/src/OpenGLSupport.cpp index e94dd3f8..207dd450 100644 --- a/src/OpenGLSupport.cpp +++ b/src/OpenGLSupport.cpp @@ -73,7 +73,7 @@ void LoadShaderCache() { // for now the shader cache only contains only compute shaders // because they take the longest to compile - FILE* file = Platform::OpenLocalFile("shadercache", "rb"); + Platform::FileHandle* file = Platform::OpenLocalFile("shadercache", Platform::FileMode::Read); if (file == nullptr) { Log(LogLevel::Error, "Could not find shader cache\n"); @@ -81,19 +81,19 @@ void LoadShaderCache() } u32 magic, version, numPrograms; - if (fread(&magic, 4, 1, file) != 1 || magic != ShaderCacheMagic) + if (Platform::FileRead(&magic, 4, 1, file) != 1 || magic != ShaderCacheMagic) { Log(LogLevel::Error, "Shader cache file has invalid magic\n"); goto fileInvalid; } - if (fread(&version, 4, 1, file) != 1 || version != ShaderCacheVersion) + if (Platform::FileRead(&version, 4, 1, file) != 1 || version != ShaderCacheVersion) { Log(LogLevel::Error, "Shader cache file has bad version\n"); goto fileInvalid; } - if (fread(&numPrograms, 4, 1, file) != 1) + if (Platform::FileRead(&numPrograms, 4, 1, file) != 1) { Log(LogLevel::Error, "Shader cache file invalid program count\n"); goto fileInvalid; @@ -107,9 +107,9 @@ void LoadShaderCache() u32 length, binaryFormat; u64 sourceHash; - error -= fread(&sourceHash, 8, 1, file); - error -= fread(&length, 4, 1, file); - error -= fread(&binaryFormat, 4, 1, file); + error -= Platform::FileRead(&sourceHash, 8, 1, file); + error -= Platform::FileRead(&length, 4, 1, file); + error -= Platform::FileRead(&binaryFormat, 4, 1, file); if (error != 0) { @@ -118,7 +118,7 @@ void LoadShaderCache() } u8* data = new u8[length]; - if (fread(data, length, 1, file) != 1) + if (Platform::FileRead(data, length, 1, file) != 1) { Log(LogLevel::Error, "Could not read shader cache entry data\n"); delete[] data; @@ -130,14 +130,12 @@ void LoadShaderCache() } fileInvalid: - fclose(file); + Platform::CloseFile(file); } void SaveShaderCache() { - FILE* file = Platform::OpenLocalFile("shadercache", "rb+"); - if (file == nullptr) - file = Platform::OpenLocalFile("shadercache", "wb"); + Platform::FileHandle* file = Platform::OpenLocalFile("shadercache", Platform::FileMode::ReadWrite); if (file == nullptr) { @@ -147,9 +145,9 @@ void SaveShaderCache() int written = 3; u32 magic = ShaderCacheMagic, version = ShaderCacheVersion, numPrograms = ShaderCache.size(); - written -= fwrite(&magic, 4, 1, file); - written -= fwrite(&version, 4, 1, file); - written -= fwrite(&numPrograms, 4, 1, file); + written -= Platform::FileWrite(&magic, 4, 1, file); + written -= Platform::FileWrite(&version, 4, 1, file); + written -= Platform::FileWrite(&numPrograms, 4, 1, file); if (written != 0) { @@ -157,7 +155,7 @@ void SaveShaderCache() goto writeError; } - fseek(file, 0, SEEK_END); + Platform::FileSeek(file, 0, Platform::FileSeekOrigin::End); printf("new shaders %d\n", NewShaders.size()); @@ -166,10 +164,10 @@ void SaveShaderCache() int error = 4; auto it = ShaderCache.find(newShader); - error -= fwrite(&it->first, 8, 1, file); - error -= fwrite(&it->second.Length, 4, 1, file); - error -= fwrite(&it->second.BinaryFormat, 4, 1, file); - error -= fwrite(it->second.Data, it->second.Length, 1, file); + error -= Platform::FileWrite(&it->first, 8, 1, file); + error -= Platform::FileWrite(&it->second.Length, 4, 1, file); + error -= Platform::FileWrite(&it->second.BinaryFormat, 4, 1, file); + error -= Platform::FileWrite(it->second.Data, it->second.Length, 1, file); if (error != 0) { @@ -179,7 +177,7 @@ void SaveShaderCache() } writeError: - fclose(file); + Platform::CloseFile(file); NewShaders.clear(); }