renderer_opengl: Add OGLRenderbuffer to resource/state management.
This commit is contained in:
		
							parent
							
								
									0c82b00dfd
								
							
						
					
					
						commit
						add2c38b73
					
				@ -15,6 +15,24 @@ MICROPROFILE_DEFINE(OpenGL_ResourceDeletion, "OpenGL", "Resource Deletion", MP_R
 | 
			
		||||
 | 
			
		||||
namespace OpenGL {
 | 
			
		||||
 | 
			
		||||
void OGLRenderbuffer::Create() {
 | 
			
		||||
    if (handle != 0)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    MICROPROFILE_SCOPE(OpenGL_ResourceCreation);
 | 
			
		||||
    glGenRenderbuffers(1, &handle);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OGLRenderbuffer::Release() {
 | 
			
		||||
    if (handle == 0)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    MICROPROFILE_SCOPE(OpenGL_ResourceDeletion);
 | 
			
		||||
    glDeleteRenderbuffers(1, &handle);
 | 
			
		||||
    OpenGLState::GetCurState().ResetRenderbuffer(handle).Apply();
 | 
			
		||||
    handle = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OGLTexture::Create(GLenum target) {
 | 
			
		||||
    if (handle != 0)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
@ -11,6 +11,31 @@
 | 
			
		||||
 | 
			
		||||
namespace OpenGL {
 | 
			
		||||
 | 
			
		||||
class OGLRenderbuffer : private NonCopyable {
 | 
			
		||||
public:
 | 
			
		||||
    OGLRenderbuffer() = default;
 | 
			
		||||
 | 
			
		||||
    OGLRenderbuffer(OGLRenderbuffer&& o) noexcept : handle(std::exchange(o.handle, 0)) {}
 | 
			
		||||
 | 
			
		||||
    ~OGLRenderbuffer() {
 | 
			
		||||
        Release();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    OGLRenderbuffer& operator=(OGLRenderbuffer&& o) noexcept {
 | 
			
		||||
        Release();
 | 
			
		||||
        handle = std::exchange(o.handle, 0);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Creates a new internal OpenGL resource and stores the handle
 | 
			
		||||
    void Create();
 | 
			
		||||
 | 
			
		||||
    /// Deletes the internal OpenGL resource
 | 
			
		||||
    void Release();
 | 
			
		||||
 | 
			
		||||
    GLuint handle = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class OGLTexture : private NonCopyable {
 | 
			
		||||
public:
 | 
			
		||||
    OGLTexture() = default;
 | 
			
		||||
 | 
			
		||||
@ -423,6 +423,13 @@ void OpenGLState::ApplyClipControl() {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OpenGLState::ApplyRenderBuffer() {
 | 
			
		||||
    if (cur_state.renderbuffer != renderbuffer) {
 | 
			
		||||
        cur_state.renderbuffer = renderbuffer;
 | 
			
		||||
        glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OpenGLState::ApplyTextures() {
 | 
			
		||||
    const std::size_t size = std::size(textures);
 | 
			
		||||
    for (std::size_t i = 0; i < size; ++i) {
 | 
			
		||||
@ -478,6 +485,7 @@ void OpenGLState::Apply() {
 | 
			
		||||
    ApplyPolygonOffset();
 | 
			
		||||
    ApplyAlphaTest();
 | 
			
		||||
    ApplyClipControl();
 | 
			
		||||
    ApplyRenderBuffer();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OpenGLState::EmulateViewportWithScissor() {
 | 
			
		||||
@ -551,4 +559,11 @@ OpenGLState& OpenGLState::ResetFramebuffer(GLuint handle) {
 | 
			
		||||
    return *this;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
OpenGLState& OpenGLState::ResetRenderbuffer(GLuint handle) {
 | 
			
		||||
    if (renderbuffer == handle) {
 | 
			
		||||
        renderbuffer = 0;
 | 
			
		||||
    }
 | 
			
		||||
    return *this;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace OpenGL
 | 
			
		||||
 | 
			
		||||
@ -158,6 +158,8 @@ public:
 | 
			
		||||
        GLenum depth_mode = GL_NEGATIVE_ONE_TO_ONE;
 | 
			
		||||
    } clip_control;
 | 
			
		||||
 | 
			
		||||
    GLuint renderbuffer{}; // GL_RENDERBUFFER_BINDING
 | 
			
		||||
 | 
			
		||||
    OpenGLState();
 | 
			
		||||
 | 
			
		||||
    /// Get the currently active OpenGL state
 | 
			
		||||
@ -196,6 +198,7 @@ public:
 | 
			
		||||
    void ApplyPolygonOffset();
 | 
			
		||||
    void ApplyAlphaTest();
 | 
			
		||||
    void ApplyClipControl();
 | 
			
		||||
    void ApplyRenderBuffer();
 | 
			
		||||
 | 
			
		||||
    /// Resets any references to the given resource
 | 
			
		||||
    OpenGLState& UnbindTexture(GLuint handle);
 | 
			
		||||
@ -204,6 +207,7 @@ public:
 | 
			
		||||
    OpenGLState& ResetPipeline(GLuint handle);
 | 
			
		||||
    OpenGLState& ResetVertexArray(GLuint handle);
 | 
			
		||||
    OpenGLState& ResetFramebuffer(GLuint handle);
 | 
			
		||||
    OpenGLState& ResetRenderbuffer(GLuint handle);
 | 
			
		||||
 | 
			
		||||
    /// Viewport does not affects glClearBuffer so emulate viewport using scissor test
 | 
			
		||||
    void EmulateViewportWithScissor();
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user