1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00

BufferManipulationObjects 2: createRenderbuffer, initRenderbuffer

This commit is contained in:
Sergey Lipskiy 2017-01-02 22:40:41 +07:00
parent cf5e9d8ed2
commit daf6646b97
17 changed files with 204 additions and 23 deletions

View File

@ -108,6 +108,12 @@ void DepthBuffer::initDepthImageTexture(FrameBuffer * _pBuffer)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_depthImageFBO);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_pDepthImageTexture->glName, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _pBuffer->m_FBO);
#else // GRAPHICS_CONTEXT
{
graphics::Context::InitTextureParams params;
@ -128,13 +134,19 @@ void DepthBuffer::initDepthImageTexture(FrameBuffer * _pBuffer)
params.magFilter = graphics::textureParameters::FILTER_NEAREST;
gfxContext.setTextureParameters(params);
}
{
graphics::Context::FrameBufferRenderTarget bufTarget;
bufTarget.bufferHandle = graphics::ObjectHandle(m_depthImageFBO);
bufTarget.bufferTarget = graphics::bufferTarget::DRAW_FRAMEBUFFER;
bufTarget.attachment = graphics::bufferAttachment::COLOR_ATTACHMENT0;
bufTarget.textureTarget = graphics::target::TEXTURE_2D;
bufTarget.textureHandle = graphics::ObjectHandle(m_pDepthImageTexture->glName);
gfxContext.addFrameBufferRenderTarget(bufTarget);
}
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _pBuffer->m_FBO);
#endif // GRAPHICS_CONTEXT
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_depthImageFBO);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_pDepthImageTexture->glName, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _pBuffer->m_FBO);
depthBufferList().clearBuffer(0, 0, VI.width, VI.height);
#endif // GL_IMAGE_TEXTURES_SUPPORT
@ -239,13 +251,27 @@ void DepthBuffer::_initDepthBufferRenderbuffer(FrameBuffer * _pBuffer)
}
}
#ifndef GRAPHICS_CONTEXT
glGenRenderbuffers(1, &m_depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, fboFormats.depthInternalFormat, m_depthRenderbufferWidth, height);
#else
graphics::ObjectHandle renderbufHandle = gfxContext.createRenderbuffer();
m_depthRenderbuffer = GLuint(renderbufHandle);
graphics::Context::InitRenderbufferParams params;
params.handle = renderbufHandle;
params.target = graphics::target::RENDERBUFFER;
params.format = fboFormats.depthInternalFormat;
params.width = m_depthRenderbufferWidth;
params.height = height;
gfxContext.initRenderbuffer(params);
#endif
}
void DepthBuffer::setDepthAttachment(GLenum _target)
void DepthBuffer::setDepthAttachment(GLuint _fbo, GLenum _target)
{
#ifndef GRAPHICS_CONTEXT
#ifndef USE_DEPTH_RENDERBUFFER
#ifdef GL_MULTISAMPLING_SUPPORT
if (config.video.multisampling != 0)
@ -256,6 +282,24 @@ void DepthBuffer::setDepthAttachment(GLenum _target)
#else
glFramebufferRenderbuffer(_target, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthRenderbuffer);
#endif
#else // GRAPHICS_CONTEXT
graphics::Context::FrameBufferRenderTarget params;
params.attachment = graphics::bufferAttachment::DEPTH_ATTACHMENT;
params.bufferHandle = graphics::ObjectHandle(_fbo);
params.bufferTarget = _target;
#ifndef USE_DEPTH_RENDERBUFFER
params.textureHandle = graphics::ObjectHandle(m_pDepthBufferTexture->glName);
params.textureTarget = config.video.multisampling != 0 ? graphics::target::TEXTURE_2D_MULTISAMPLE : graphics::target::TEXTURE_2D;
#else
params.textureHandle = graphics::ObjectHandle(m_depthRenderbuffer);
params.textureTarget = graphics::target::RENDERBUFFER;
#endif // USE_DEPTH_RENDERBUFFER
gfxContext.addFrameBufferRenderTarget(params);
#endif //GRAPHICS_CONTEXT
m_copied = false;
m_resolved = false;
}

View File

@ -15,7 +15,7 @@ struct DepthBuffer
CachedTexture * resolveDepthBufferTexture(FrameBuffer * _pBuffer);
CachedTexture * copyDepthBufferTexture(FrameBuffer * _pBuffer);
void setDepthAttachment(GLenum _target);
void setDepthAttachment(GLuint _fbo, GLenum _target);
void activateDepthBufferTexture(FrameBuffer * _pBuffer);
void bindDepthImageTexture();

View File

@ -871,7 +871,7 @@ void FrameBufferList::attachDepthBuffer()
if (pDepthBuffer->m_depthRenderbufferWidth == m_pCurrent->m_pTexture->realWidth) {
#endif // USE_DEPTH_RENDERBUFFER
m_pCurrent->m_pDepthBuffer = pDepthBuffer;
pDepthBuffer->setDepthAttachment(GL_DRAW_FRAMEBUFFER);
pDepthBuffer->setDepthAttachment(m_pCurrent->m_FBO, GL_DRAW_FRAMEBUFFER);
if (video().getRender().isImageTexturesSupported() && config.frameBufferEmulation.N64DepthCompare != 0)
pDepthBuffer->bindDepthImageTexture();
} else

View File

@ -53,6 +53,16 @@ void Context::deleteFramebuffer(ObjectHandle _name)
m_impl->deleteFramebuffer(_name);
}
ObjectHandle Context::createRenderbuffer()
{
return m_impl->createRenderbuffer();
}
void Context::initRenderbuffer(const InitRenderbufferParams & _params)
{
m_impl->initRenderbuffer(_params);
}
void Context::addFrameBufferRenderTarget(const FrameBufferRenderTarget & _params)
{
m_impl->addFrameBufferRenderTarget(_params);

View File

@ -57,6 +57,18 @@ namespace graphics {
void deleteFramebuffer(ObjectHandle _name);
ObjectHandle createRenderbuffer();
struct InitRenderbufferParams {
ObjectHandle handle;
Parameter target;
Parameter format;
u32 width = 0;
u32 height = 0;
};
void initRenderbuffer(const InitRenderbufferParams & _params);
struct FrameBufferRenderTarget {
ObjectHandle bufferHandle;
Parameter bufferTarget;

View File

@ -19,6 +19,8 @@ namespace graphics {
virtual ObjectHandle createFramebuffer() = 0;
virtual void deleteFramebuffer(ObjectHandle _name) = 0;
virtual void addFrameBufferRenderTarget(const Context::FrameBufferRenderTarget & _params) = 0;
virtual ObjectHandle createRenderbuffer() = 0;
virtual void initRenderbuffer(const Context::InitRenderbufferParams & _params) = 0;
};
}

View File

@ -39,6 +39,37 @@ public:
}
};
/*---------------CreateRenderbuffer-------------*/
class GenRenderbuffer : public CreateRenderbuffer
{
public:
graphics::ObjectHandle createRenderbuffer() override
{
GLuint renderbuffer;
glGenRenderbuffers(1, &renderbuffer);
return graphics::ObjectHandle(renderbuffer);
}
};
/*---------------InitRenderbuffer-------------*/
class RenderbufferStorage : public InitRenderbuffer
{
public:
RenderbufferStorage(CachedBindRenderbuffer * _bind) : m_bind(_bind) {}
void initRenderbuffer(const graphics::Context::InitRenderbufferParams & _params) override
{
m_bind->bind(_params.target, _params.handle);
glRenderbufferStorage(GLenum(_params.target), GLenum(_params.format), _params.width, _params.height);
}
private:
CachedBindRenderbuffer * m_bind;
};
/*---------------AddFramebufferTarget-------------*/
class AddFramebufferTexture2D : public AddFramebufferRenderTarget
@ -49,11 +80,18 @@ public:
void addFrameBufferRenderTarget(const graphics::Context::FrameBufferRenderTarget & _params) override
{
m_bind->bind(_params.bufferTarget, _params.bufferHandle);
glFramebufferTexture2D(GLenum(_params.bufferTarget),
GLenum(_params.attachment),
GLenum(_params.textureTarget),
GLuint(_params.textureHandle),
0);
if (_params.textureTarget == graphics::target::RENDERBUFFER) {
glFramebufferRenderbuffer(GLenum(_params.bufferTarget),
GLenum(_params.attachment),
GLenum(_params.textureTarget),
GLuint(_params.textureHandle));
} else {
glFramebufferTexture2D(GLenum(_params.bufferTarget),
GLenum(_params.attachment),
GLenum(_params.textureTarget),
GLuint(_params.textureHandle),
0);
}
}
private:
@ -102,6 +140,16 @@ CreateFramebufferObject * BufferManipulationObjectFactory::getCreateFramebufferO
return new GenFramebuffer;
}
CreateRenderbuffer * BufferManipulationObjectFactory::getCreateRenderbuffer() const
{
return new GenRenderbuffer;
}
InitRenderbuffer * BufferManipulationObjectFactory::getInitRenderbuffer() const
{
return new RenderbufferStorage(m_cachedFunctions.geCachedBindRenderbuffer());
}
AddFramebufferRenderTarget * BufferManipulationObjectFactory::getAddFramebufferRenderTarget() const
{
if (AddNamedFramebufferTexture::Check(m_version))

View File

@ -15,6 +15,19 @@ namespace opengl {
virtual graphics::ObjectHandle createFramebuffer() = 0;
};
class CreateRenderbuffer
{
public:
virtual ~CreateRenderbuffer() {};
virtual graphics::ObjectHandle createRenderbuffer() = 0;
};
class InitRenderbuffer
{
public:
virtual ~InitRenderbuffer() {};
virtual void initRenderbuffer(const graphics::Context::InitRenderbufferParams & _params) = 0;
};
class AddFramebufferRenderTarget
{
@ -32,6 +45,10 @@ namespace opengl {
CreateFramebufferObject * getCreateFramebufferObject() const;
CreateRenderbuffer * getCreateRenderbuffer() const;
InitRenderbuffer * getInitRenderbuffer() const;
AddFramebufferRenderTarget * getAddFramebufferRenderTarget() const;
private:

View File

@ -71,7 +71,8 @@ void CachedActiveTexture::setActiveTexture(u32 _index) {
/*---------------CachedFunctions-------------*/
CachedFunctions::CachedFunctions()
: m_bindFramebuffer(glBindFramebuffer) {
: m_bindFramebuffer(glBindFramebuffer)
, m_bindRenderbuffer(glBindRenderbuffer) {
}
@ -114,3 +115,8 @@ CachedBindFramebuffer * CachedFunctions::geCachedBindFramebuffer()
{
return &m_bindFramebuffer;
}
CachedBindRenderbuffer * CachedFunctions::geCachedBindRenderbuffer()
{
return &m_bindRenderbuffer;
}

View File

@ -44,6 +44,8 @@ namespace opengl {
typedef CachedBind<decltype(glBindFramebuffer)> CachedBindFramebuffer;
typedef CachedBind<decltype(glBindRenderbuffer)> CachedBindRenderbuffer;
class CachedBindTexture
{
public:
@ -87,6 +89,8 @@ namespace opengl {
CachedBindFramebuffer * geCachedBindFramebuffer();
CachedBindRenderbuffer * geCachedBindRenderbuffer();
private:
typedef std::unordered_map<u32, CachedEnable> EnableParameters;
@ -94,6 +98,7 @@ namespace opengl {
CachedBindTexture m_bindTexture;
CachedActiveTexture m_activeTexture;
CachedBindFramebuffer m_bindFramebuffer;
CachedBindRenderbuffer m_bindRenderbuffer;
};
}

View File

@ -35,6 +35,8 @@ void ContextImpl::init()
{
BufferManipulationObjectFactory bufferObjectFactory(m_version, *m_cachedFunctions.get());
m_createFramebuffer.reset(bufferObjectFactory.getCreateFramebufferObject());
m_createRenderbuffer.reset(bufferObjectFactory.getCreateRenderbuffer());
m_initRenderbuffer.reset(bufferObjectFactory.getInitRenderbuffer());
m_addFramebufferRenderTarget.reset(bufferObjectFactory.getAddFramebufferRenderTarget());
}
}
@ -47,6 +49,8 @@ void ContextImpl::destroy()
m_set2DTextureParameters.reset(nullptr);
m_createFramebuffer.reset(nullptr);
m_createRenderbuffer.reset(nullptr);
m_initRenderbuffer.reset(nullptr);
m_addFramebufferRenderTarget.reset(nullptr);
}
@ -86,6 +90,16 @@ void ContextImpl::deleteFramebuffer(graphics::ObjectHandle _name)
glDeleteFramebuffers(1, &fbo);
}
graphics::ObjectHandle ContextImpl::createRenderbuffer()
{
return m_createRenderbuffer->createRenderbuffer();
}
void ContextImpl::initRenderbuffer(const graphics::Context::InitRenderbufferParams & _params)
{
m_initRenderbuffer->initRenderbuffer(_params);
}
void ContextImpl::addFrameBufferRenderTarget(const graphics::Context::FrameBufferRenderTarget & _params)
{
m_addFramebufferRenderTarget->addFrameBufferRenderTarget(_params);

View File

@ -30,6 +30,10 @@ namespace opengl {
void deleteFramebuffer(graphics::ObjectHandle _name) override;
graphics::ObjectHandle createRenderbuffer() override;
void initRenderbuffer(const graphics::Context::InitRenderbufferParams & _params) override;
void addFrameBufferRenderTarget(const graphics::Context::FrameBufferRenderTarget & _params) override;
private:
@ -39,6 +43,8 @@ namespace opengl {
std::unique_ptr<Set2DTextureParameters> m_set2DTextureParameters;
std::unique_ptr<CreateFramebufferObject> m_createFramebuffer;
std::unique_ptr<CreateRenderbuffer> m_createRenderbuffer;
std::unique_ptr<InitRenderbuffer> m_initRenderbuffer;
std::unique_ptr<AddFramebufferRenderTarget> m_addFramebufferRenderTarget;
GLVersion m_version;

View File

@ -28,6 +28,7 @@ namespace graphics {
namespace target {
Parameter TEXTURE_2D(GL_TEXTURE_2D);
Parameter TEXTURE_2D_MULTISAMPLE(GL_TEXTURE_2D_MULTISAMPLE);
Parameter RENDERBUFFER(GL_RENDERBUFFER);
}
namespace bufferTarget {
@ -38,6 +39,7 @@ namespace graphics {
namespace bufferAttachment {
Parameter COLOR_ATTACHMENT0(GL_COLOR_ATTACHMENT0);
Parameter DEPTH_ATTACHMENT(GL_DEPTH_ATTACHMENT);
}
namespace enable {

View File

@ -17,7 +17,10 @@ namespace graphics {
explicit operator s32() const { return static_cast<s32>(m_iparameter); }
explicit operator f32() const { return m_fparameter; }
bool isValid() const { return m_iparameter != INVALID_PARAMETER; };
bool isValid() const { return m_iparameter != INVALID_PARAMETER; }
bool operator==(const Parameter & _other) const { return m_iparameter == _other.m_iparameter; }
private:
union {
u32 m_iparameter;

View File

@ -28,6 +28,7 @@ namespace graphics {
namespace target {
extern Parameter TEXTURE_2D;
extern Parameter TEXTURE_2D_MULTISAMPLE;
extern Parameter RENDERBUFFER;
}
namespace bufferTarget {
@ -38,6 +39,7 @@ namespace graphics {
namespace bufferAttachment {
extern Parameter COLOR_ATTACHMENT0;
extern Parameter DEPTH_ATTACHMENT;
}
namespace enable {

View File

@ -386,11 +386,6 @@ OGLRender::TexrectDrawer::TexrectDrawer()
void OGLRender::TexrectDrawer::init()
{
// generate a framebuffer
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glGenFramebuffers(1, &m_FBO);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO);
m_pTexture = textureCache().addFrameBufferTexture(false);
m_pTexture->format = G_IM_FMT_RGBA;
m_pTexture->clampS = 1;
@ -413,6 +408,13 @@ void OGLRender::TexrectDrawer::init()
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
// generate a framebuffer
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glGenFramebuffers(1, &m_FBO);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_pTexture->glName, 0);
#else // GRAPHICS_CONTEXT
graphics::Context::InitTextureParams initParams;
@ -431,9 +433,17 @@ void OGLRender::TexrectDrawer::init()
setParams.magFilter = graphics::textureParameters::FILTER_LINEAR;
gfxContext.setTextureParameters(setParams);
graphics::ObjectHandle fboHandle = gfxContext.createFramebuffer();
m_FBO = GLuint(fboHandle);
graphics::Context::FrameBufferRenderTarget bufTarget;
bufTarget.bufferHandle = fboHandle;
bufTarget.bufferTarget = graphics::bufferTarget::DRAW_FRAMEBUFFER;
bufTarget.attachment = graphics::bufferAttachment::COLOR_ATTACHMENT0;
bufTarget.textureTarget = graphics::target::TEXTURE_2D;
bufTarget.textureHandle = graphics::ObjectHandle(m_pTexture->glName);
gfxContext.addFrameBufferRenderTarget(bufTarget);
#endif // GRAPHICS_CONTEXT
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_pTexture->glName, 0);
// check if everything is OK
assert(checkFBO());
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

View File

@ -2147,7 +2147,7 @@ void _copyDepthBuffer()
if (pCopyBufferDepth == nullptr)
return;
glBindFramebuffer(GL_READ_FRAMEBUFFER, pTmpBuffer->m_FBO);
pCopyBufferDepth->setDepthAttachment(GL_READ_FRAMEBUFFER);
pCopyBufferDepth->setDepthAttachment(pTmpBuffer->m_FBO, GL_READ_FRAMEBUFFER);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbList.getCurrent()->m_FBO);
OGLVideo & ogl = video();
glBlitFramebuffer(
@ -2157,7 +2157,7 @@ void _copyDepthBuffer()
);
// Restore objects
if (pTmpBuffer->m_pDepthBuffer != nullptr)
pTmpBuffer->m_pDepthBuffer->setDepthAttachment(GL_READ_FRAMEBUFFER);
pTmpBuffer->m_pDepthBuffer->setDepthAttachment(fbList.getCurrent()->m_FBO, GL_READ_FRAMEBUFFER);
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
// Set back current depth buffer
dbList.saveBuffer(gDP.depthImageAddress);