#pragma once #include "GLExtensions.h" #include "ShaderTypes.h" #include "TemporalHistoryBuffers.h" #include #include #include #include #include class OpenGLRenderer { public: struct LayerProgram { struct TextureBinding { std::string samplerName; std::filesystem::path sourcePath; GLuint texture = 0; }; struct TextBinding { std::string parameterId; std::string samplerName; std::string fontId; GLuint texture = 0; std::string renderedText; unsigned renderedWidth = 0; unsigned renderedHeight = 0; }; std::string layerId; std::string shaderId; GLuint shaderTextureBase = 0; GLuint program = 0; GLuint vertexShader = 0; GLuint fragmentShader = 0; std::vector textureBindings; std::vector textBindings; }; GLuint CaptureTexture() const { return mCaptureTexture; } GLuint DecodedTexture() const { return mDecodedTexture; } GLuint LayerTempTexture() const { return mLayerTempTexture; } GLuint CompositeTexture() const { return mFBOTexture; } GLuint OutputTexture() const { return mOutputTexture; } GLuint OutputPackTexture() const { return mOutputPackTexture; } GLuint TextureUploadBuffer() const { return mTextureUploadBuffer; } GLuint DecodeFramebuffer() const { return mDecodeFrameBuf; } GLuint LayerTempFramebuffer() const { return mLayerTempFrameBuf; } GLuint CompositeFramebuffer() const { return mIdFrameBuf; } GLuint OutputFramebuffer() const { return mOutputFrameBuf; } GLuint OutputPackFramebuffer() const { return mOutputPackFrameBuf; } GLuint FullscreenVertexArray() const { return mFullscreenVAO; } GLuint GlobalParamsUBO() const { return mGlobalParamsUBO; } GLuint DecodeProgram() const { return mDecodeProgram; } GLuint OutputPackProgram() const { return mOutputPackProgram; } GLsizeiptr GlobalParamsUBOSize() const { return mGlobalParamsUBOSize; } void SetGlobalParamsUBOSize(GLsizeiptr size) { mGlobalParamsUBOSize = size; } void ReplaceLayerPrograms(std::vector& newPrograms) { mLayerPrograms.swap(newPrograms); } std::vector& LayerPrograms() { return mLayerPrograms; } const std::vector& LayerPrograms() const { return mLayerPrograms; } TemporalHistoryBuffers& TemporalHistory() { return mTemporalHistory; } const TemporalHistoryBuffers& TemporalHistory() const { return mTemporalHistory; } void SetDecodeShaderProgram(GLuint program, GLuint vertexShader, GLuint fragmentShader); void SetOutputPackShaderProgram(GLuint program, GLuint vertexShader, GLuint fragmentShader); bool InitializeResources(unsigned inputFrameWidth, unsigned inputFrameHeight, unsigned captureTextureWidth, unsigned outputFrameWidth, unsigned outputFrameHeight, unsigned outputPackTextureWidth, std::string& error); void ResizeView(int width, int height); void PresentToWindow(HDC hdc, unsigned outputFrameWidth, unsigned outputFrameHeight); void DestroyResources(); void DestroySingleLayerProgram(LayerProgram& layerProgram); void DestroyLayerPrograms(); void DestroyDecodeShaderProgram(); void DestroyOutputPackShaderProgram(); private: GLuint mCaptureTexture = 0; GLuint mDecodedTexture = 0; GLuint mLayerTempTexture = 0; GLuint mFBOTexture = 0; GLuint mOutputTexture = 0; GLuint mOutputPackTexture = 0; GLuint mTextureUploadBuffer = 0; GLuint mDecodeFrameBuf = 0; GLuint mLayerTempFrameBuf = 0; GLuint mIdFrameBuf = 0; GLuint mOutputFrameBuf = 0; GLuint mOutputPackFrameBuf = 0; GLuint mIdColorBuf = 0; GLuint mIdDepthBuf = 0; GLuint mFullscreenVAO = 0; GLuint mGlobalParamsUBO = 0; GLuint mDecodeProgram = 0; GLuint mDecodeVertexShader = 0; GLuint mDecodeFragmentShader = 0; GLuint mOutputPackProgram = 0; GLuint mOutputPackVertexShader = 0; GLuint mOutputPackFragmentShader = 0; GLsizeiptr mGlobalParamsUBOSize = 0; int mViewWidth = 0; int mViewHeight = 0; std::vector mLayerPrograms; TemporalHistoryBuffers mTemporalHistory; };