actually adapt to latest changes

This commit is contained in:
RSDuck 2023-09-27 00:12:35 +02:00
parent 875d455bbf
commit a5791273d4
6 changed files with 56 additions and 58 deletions

View File

@ -406,7 +406,10 @@ void InitRenderer(int renderer)
renderer = 0; renderer = 0;
GPU3D::CurrentRenderer = std::make_unique<GPU3D::SoftRenderer>(); GPU3D::CurrentRenderer = std::make_unique<GPU3D::SoftRenderer>();
} }
if (renderer == renderer3D_OpenGL)
GPU3D::CurrentRenderer = GPU3D::GLRenderer::New(); GPU3D::CurrentRenderer = GPU3D::GLRenderer::New();
else if (renderer == renderer3D_OpenGLCompute)
GPU3D::CurrentRenderer = GPU3D::ComputeRenderer::New();
if (!GPU3D::CurrentRenderer) if (!GPU3D::CurrentRenderer)
{ {
// Fallback on software renderer // Fallback on software renderer

View File

@ -158,10 +158,10 @@ public:
virtual u32* GetLine(int line) = 0; virtual u32* GetLine(int line) = 0;
virtual void SetupAccelFrame() {} virtual void SetupAccelFrame() {}
virtual void PrepareCaptureFrame() {}
protected: protected:
Renderer3D(bool Accelerated); Renderer3D(bool Accelerated);
virtual void PrepareCaptureFrame() {}
}; };
extern int Renderer; extern int Renderer;

View File

@ -31,11 +31,6 @@ ComputeRenderer::ComputeRenderer()
: Renderer3D(true), Texcache(TexcacheOpenGLLoader()) : Renderer3D(true), Texcache(TexcacheOpenGLLoader())
{} {}
ComputeRenderer::~ComputeRenderer()
{}
bool ComputeRenderer::CompileShader(GLuint& shader, const std::string& source, const std::initializer_list<const char*>& defines) bool ComputeRenderer::CompileShader(GLuint& shader, const std::string& source, const std::initializer_list<const char*>& defines)
{ {
std::string shaderName; std::string shaderName;
@ -67,55 +62,57 @@ void blah(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,con
printf("%s\n", message); printf("%s\n", message);
} }
bool ComputeRenderer::Init() std::unique_ptr<ComputeRenderer> ComputeRenderer::New()
{ {
std::unique_ptr<ComputeRenderer> result = std::unique_ptr<ComputeRenderer>(new ComputeRenderer());
//glDebugMessageCallback(blah, NULL); //glDebugMessageCallback(blah, NULL);
//glEnable(GL_DEBUG_OUTPUT); //glEnable(GL_DEBUG_OUTPUT);
glGenBuffers(1, &YSpanSetupMemory); glGenBuffers(1, &result->YSpanSetupMemory);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, YSpanSetupMemory); glBindBuffer(GL_SHADER_STORAGE_BUFFER, result->YSpanSetupMemory);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(SpanSetupY)*MaxYSpanSetups, nullptr, GL_DYNAMIC_DRAW); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(SpanSetupY)*MaxYSpanSetups, nullptr, GL_DYNAMIC_DRAW);
glGenBuffers(1, &RenderPolygonMemory); glGenBuffers(1, &result->RenderPolygonMemory);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, RenderPolygonMemory); glBindBuffer(GL_SHADER_STORAGE_BUFFER, result->RenderPolygonMemory);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(RenderPolygon)*2048, nullptr, GL_DYNAMIC_DRAW); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(RenderPolygon)*2048, nullptr, GL_DYNAMIC_DRAW);
glGenBuffers(1, &XSpanSetupMemory); glGenBuffers(1, &result->XSpanSetupMemory);
glGenBuffers(1, &BinResultMemory); glGenBuffers(1, &result->BinResultMemory);
glGenBuffers(1, &FinalTileMemory); glGenBuffers(1, &result->FinalTileMemory);
glGenBuffers(1, &YSpanIndicesTextureMemory); glGenBuffers(1, &result->YSpanIndicesTextureMemory);
glGenBuffers(tilememoryLayer_Num, TileMemory); glGenBuffers(tilememoryLayer_Num, result->TileMemory);
glGenBuffers(1, &WorkDescMemory); glGenBuffers(1, &result->WorkDescMemory);
glGenTextures(1, &YSpanIndicesTexture); glGenTextures(1, &result->YSpanIndicesTexture);
glGenTextures(1, &LowResFramebuffer); glGenTextures(1, &result->LowResFramebuffer);
glBindTexture(GL_TEXTURE_2D, LowResFramebuffer); glBindTexture(GL_TEXTURE_2D, result->LowResFramebuffer);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8UI, 256, 192); glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8UI, 256, 192);
glGenBuffers(1, &MetaUniformMemory); glGenBuffers(1, &result->MetaUniformMemory);
glBindBuffer(GL_UNIFORM_BUFFER, MetaUniformMemory); glBindBuffer(GL_UNIFORM_BUFFER, result->MetaUniformMemory);
glBufferData(GL_UNIFORM_BUFFER, sizeof(MetaUniform), nullptr, GL_DYNAMIC_DRAW); 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 j = 0; j < 3; j++)
{ {
for (u32 i = 0; i < 3; i++) for (u32 i = 0; i < 3; i++)
{ {
const GLenum translateWrapMode[3] = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT}; 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(result->Samplers[i+j*3], GL_TEXTURE_WRAP_S, translateWrapMode[i]);
glSamplerParameteri(Samplers[i+j*3], GL_TEXTURE_WRAP_T, translateWrapMode[j]); glSamplerParameteri(result->Samplers[i+j*3], GL_TEXTURE_WRAP_T, translateWrapMode[j]);
glSamplerParameteri(Samplers[i+j*3], GL_TEXTURE_MIN_FILTER, GL_NEAREST); glSamplerParameteri(result->Samplers[i+j*3], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glSamplerParameterf(Samplers[i+j*3], GL_TEXTURE_MAG_FILTER, GL_NEAREST); glSamplerParameterf(result->Samplers[i+j*3], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
} }
} }
glGenBuffers(1, &PixelBuffer); glGenBuffers(1, &result->PixelBuffer);
glBindBuffer(GL_PIXEL_PACK_BUFFER, PixelBuffer); glBindBuffer(GL_PIXEL_PACK_BUFFER, result->PixelBuffer);
glBufferData(GL_PIXEL_PACK_BUFFER, 256*192*4, NULL, GL_DYNAMIC_READ); glBufferData(GL_PIXEL_PACK_BUFFER, 256*192*4, NULL, GL_DYNAMIC_READ);
return true; return result;
} }
void ComputeRenderer::DeInit() ComputeRenderer::~ComputeRenderer()
{ {
Texcache.Reset(); Texcache.Reset();

View File

@ -19,6 +19,8 @@
#ifndef GPU3D_COMPUTE #ifndef GPU3D_COMPUTE
#define GPU3D_COMPUTE #define GPU3D_COMPUTE
#include <memory>
#include "GPU3D.h" #include "GPU3D.h"
#include "OpenGLSupport.h" #include "OpenGLSupport.h"
@ -33,11 +35,9 @@ namespace GPU3D
class ComputeRenderer : public Renderer3D class ComputeRenderer : public Renderer3D
{ {
public: public:
ComputeRenderer(); static std::unique_ptr<ComputeRenderer> New();
~ComputeRenderer() override; ~ComputeRenderer() override;
bool Init() override;
void DeInit() override;
void Reset() override; void Reset() override;
void SetRenderSettings(GPU::RenderSettings& settings) override; void SetRenderSettings(GPU::RenderSettings& settings) override;
@ -51,6 +51,8 @@ public:
void SetupAccelFrame() override; void SetupAccelFrame() override;
void PrepareCaptureFrame() override; void PrepareCaptureFrame() override;
private: private:
ComputeRenderer();
GLuint ShaderInterpXSpans[2]; GLuint ShaderInterpXSpans[2];
GLuint ShaderBinCombined; GLuint ShaderBinCombined;
GLuint ShaderDepthBlend[2]; GLuint ShaderDepthBlend[2];

View File

@ -38,8 +38,6 @@ public:
virtual u32* GetLine(int line) override; virtual u32* GetLine(int line) override;
void SetupAccelFrame() override; void SetupAccelFrame() override;
void PrepareCaptureFrame();
void PrepareCaptureFrame() override; void PrepareCaptureFrame() override;
static std::unique_ptr<GLRenderer> New() noexcept; static std::unique_ptr<GLRenderer> New() noexcept;

View File

@ -73,7 +73,7 @@ void LoadShaderCache()
{ {
// for now the shader cache only contains only compute shaders // for now the shader cache only contains only compute shaders
// because they take the longest to compile // 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) if (file == nullptr)
{ {
Log(LogLevel::Error, "Could not find shader cache\n"); Log(LogLevel::Error, "Could not find shader cache\n");
@ -81,19 +81,19 @@ void LoadShaderCache()
} }
u32 magic, version, numPrograms; 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"); Log(LogLevel::Error, "Shader cache file has invalid magic\n");
goto fileInvalid; 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"); Log(LogLevel::Error, "Shader cache file has bad version\n");
goto fileInvalid; 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"); Log(LogLevel::Error, "Shader cache file invalid program count\n");
goto fileInvalid; goto fileInvalid;
@ -107,9 +107,9 @@ void LoadShaderCache()
u32 length, binaryFormat; u32 length, binaryFormat;
u64 sourceHash; u64 sourceHash;
error -= fread(&sourceHash, 8, 1, file); error -= Platform::FileRead(&sourceHash, 8, 1, file);
error -= fread(&length, 4, 1, file); error -= Platform::FileRead(&length, 4, 1, file);
error -= fread(&binaryFormat, 4, 1, file); error -= Platform::FileRead(&binaryFormat, 4, 1, file);
if (error != 0) if (error != 0)
{ {
@ -118,7 +118,7 @@ void LoadShaderCache()
} }
u8* data = new u8[length]; 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"); Log(LogLevel::Error, "Could not read shader cache entry data\n");
delete[] data; delete[] data;
@ -130,14 +130,12 @@ void LoadShaderCache()
} }
fileInvalid: fileInvalid:
fclose(file); Platform::CloseFile(file);
} }
void SaveShaderCache() void SaveShaderCache()
{ {
FILE* file = Platform::OpenLocalFile("shadercache", "rb+"); Platform::FileHandle* file = Platform::OpenLocalFile("shadercache", Platform::FileMode::ReadWrite);
if (file == nullptr)
file = Platform::OpenLocalFile("shadercache", "wb");
if (file == nullptr) if (file == nullptr)
{ {
@ -147,9 +145,9 @@ void SaveShaderCache()
int written = 3; int written = 3;
u32 magic = ShaderCacheMagic, version = ShaderCacheVersion, numPrograms = ShaderCache.size(); u32 magic = ShaderCacheMagic, version = ShaderCacheVersion, numPrograms = ShaderCache.size();
written -= fwrite(&magic, 4, 1, file); written -= Platform::FileWrite(&magic, 4, 1, file);
written -= fwrite(&version, 4, 1, file); written -= Platform::FileWrite(&version, 4, 1, file);
written -= fwrite(&numPrograms, 4, 1, file); written -= Platform::FileWrite(&numPrograms, 4, 1, file);
if (written != 0) if (written != 0)
{ {
@ -157,7 +155,7 @@ void SaveShaderCache()
goto writeError; goto writeError;
} }
fseek(file, 0, SEEK_END); Platform::FileSeek(file, 0, Platform::FileSeekOrigin::End);
printf("new shaders %d\n", NewShaders.size()); printf("new shaders %d\n", NewShaders.size());
@ -166,10 +164,10 @@ void SaveShaderCache()
int error = 4; int error = 4;
auto it = ShaderCache.find(newShader); auto it = ShaderCache.find(newShader);
error -= fwrite(&it->first, 8, 1, file); error -= Platform::FileWrite(&it->first, 8, 1, file);
error -= fwrite(&it->second.Length, 4, 1, file); error -= Platform::FileWrite(&it->second.Length, 4, 1, file);
error -= fwrite(&it->second.BinaryFormat, 4, 1, file); error -= Platform::FileWrite(&it->second.BinaryFormat, 4, 1, file);
error -= fwrite(it->second.Data, it->second.Length, 1, file); error -= Platform::FileWrite(it->second.Data, it->second.Length, 1, file);
if (error != 0) if (error != 0)
{ {
@ -179,7 +177,7 @@ void SaveShaderCache()
} }
writeError: writeError:
fclose(file); Platform::CloseFile(file);
NewShaders.clear(); NewShaders.clear();
} }