mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-04 10:03:36 +00:00
BufferManipulationObjects 2: createRenderbuffer, initRenderbuffer
This commit is contained in:
parent
cf5e9d8ed2
commit
daf6646b97
|
@ -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_MAG_FILTER, GL_NEAREST);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
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
|
#else // GRAPHICS_CONTEXT
|
||||||
{
|
{
|
||||||
graphics::Context::InitTextureParams params;
|
graphics::Context::InitTextureParams params;
|
||||||
|
@ -128,13 +134,19 @@ void DepthBuffer::initDepthImageTexture(FrameBuffer * _pBuffer)
|
||||||
params.magFilter = graphics::textureParameters::FILTER_NEAREST;
|
params.magFilter = graphics::textureParameters::FILTER_NEAREST;
|
||||||
gfxContext.setTextureParameters(params);
|
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
|
#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);
|
depthBufferList().clearBuffer(0, 0, VI.width, VI.height);
|
||||||
#endif // GL_IMAGE_TEXTURES_SUPPORT
|
#endif // GL_IMAGE_TEXTURES_SUPPORT
|
||||||
|
@ -239,13 +251,27 @@ void DepthBuffer::_initDepthBufferRenderbuffer(FrameBuffer * _pBuffer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef GRAPHICS_CONTEXT
|
||||||
glGenRenderbuffers(1, &m_depthRenderbuffer);
|
glGenRenderbuffers(1, &m_depthRenderbuffer);
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, m_depthRenderbuffer);
|
glBindRenderbuffer(GL_RENDERBUFFER, m_depthRenderbuffer);
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, fboFormats.depthInternalFormat, m_depthRenderbufferWidth, height);
|
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
|
#ifndef USE_DEPTH_RENDERBUFFER
|
||||||
#ifdef GL_MULTISAMPLING_SUPPORT
|
#ifdef GL_MULTISAMPLING_SUPPORT
|
||||||
if (config.video.multisampling != 0)
|
if (config.video.multisampling != 0)
|
||||||
|
@ -256,6 +282,24 @@ void DepthBuffer::setDepthAttachment(GLenum _target)
|
||||||
#else
|
#else
|
||||||
glFramebufferRenderbuffer(_target, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthRenderbuffer);
|
glFramebufferRenderbuffer(_target, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthRenderbuffer);
|
||||||
#endif
|
#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_copied = false;
|
||||||
m_resolved = false;
|
m_resolved = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ struct DepthBuffer
|
||||||
CachedTexture * resolveDepthBufferTexture(FrameBuffer * _pBuffer);
|
CachedTexture * resolveDepthBufferTexture(FrameBuffer * _pBuffer);
|
||||||
CachedTexture * copyDepthBufferTexture(FrameBuffer * _pBuffer);
|
CachedTexture * copyDepthBufferTexture(FrameBuffer * _pBuffer);
|
||||||
|
|
||||||
void setDepthAttachment(GLenum _target);
|
void setDepthAttachment(GLuint _fbo, GLenum _target);
|
||||||
void activateDepthBufferTexture(FrameBuffer * _pBuffer);
|
void activateDepthBufferTexture(FrameBuffer * _pBuffer);
|
||||||
|
|
||||||
void bindDepthImageTexture();
|
void bindDepthImageTexture();
|
||||||
|
|
|
@ -871,7 +871,7 @@ void FrameBufferList::attachDepthBuffer()
|
||||||
if (pDepthBuffer->m_depthRenderbufferWidth == m_pCurrent->m_pTexture->realWidth) {
|
if (pDepthBuffer->m_depthRenderbufferWidth == m_pCurrent->m_pTexture->realWidth) {
|
||||||
#endif // USE_DEPTH_RENDERBUFFER
|
#endif // USE_DEPTH_RENDERBUFFER
|
||||||
m_pCurrent->m_pDepthBuffer = pDepthBuffer;
|
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)
|
if (video().getRender().isImageTexturesSupported() && config.frameBufferEmulation.N64DepthCompare != 0)
|
||||||
pDepthBuffer->bindDepthImageTexture();
|
pDepthBuffer->bindDepthImageTexture();
|
||||||
} else
|
} else
|
||||||
|
|
|
@ -53,6 +53,16 @@ void Context::deleteFramebuffer(ObjectHandle _name)
|
||||||
m_impl->deleteFramebuffer(_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)
|
void Context::addFrameBufferRenderTarget(const FrameBufferRenderTarget & _params)
|
||||||
{
|
{
|
||||||
m_impl->addFrameBufferRenderTarget(_params);
|
m_impl->addFrameBufferRenderTarget(_params);
|
||||||
|
|
|
@ -57,6 +57,18 @@ namespace graphics {
|
||||||
|
|
||||||
void deleteFramebuffer(ObjectHandle _name);
|
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 {
|
struct FrameBufferRenderTarget {
|
||||||
ObjectHandle bufferHandle;
|
ObjectHandle bufferHandle;
|
||||||
Parameter bufferTarget;
|
Parameter bufferTarget;
|
||||||
|
|
|
@ -19,6 +19,8 @@ namespace graphics {
|
||||||
virtual ObjectHandle createFramebuffer() = 0;
|
virtual ObjectHandle createFramebuffer() = 0;
|
||||||
virtual void deleteFramebuffer(ObjectHandle _name) = 0;
|
virtual void deleteFramebuffer(ObjectHandle _name) = 0;
|
||||||
virtual void addFrameBufferRenderTarget(const Context::FrameBufferRenderTarget & _params) = 0;
|
virtual void addFrameBufferRenderTarget(const Context::FrameBufferRenderTarget & _params) = 0;
|
||||||
|
virtual ObjectHandle createRenderbuffer() = 0;
|
||||||
|
virtual void initRenderbuffer(const Context::InitRenderbufferParams & _params) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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-------------*/
|
/*---------------AddFramebufferTarget-------------*/
|
||||||
|
|
||||||
class AddFramebufferTexture2D : public AddFramebufferRenderTarget
|
class AddFramebufferTexture2D : public AddFramebufferRenderTarget
|
||||||
|
@ -49,11 +80,18 @@ public:
|
||||||
void addFrameBufferRenderTarget(const graphics::Context::FrameBufferRenderTarget & _params) override
|
void addFrameBufferRenderTarget(const graphics::Context::FrameBufferRenderTarget & _params) override
|
||||||
{
|
{
|
||||||
m_bind->bind(_params.bufferTarget, _params.bufferHandle);
|
m_bind->bind(_params.bufferTarget, _params.bufferHandle);
|
||||||
glFramebufferTexture2D(GLenum(_params.bufferTarget),
|
if (_params.textureTarget == graphics::target::RENDERBUFFER) {
|
||||||
GLenum(_params.attachment),
|
glFramebufferRenderbuffer(GLenum(_params.bufferTarget),
|
||||||
GLenum(_params.textureTarget),
|
GLenum(_params.attachment),
|
||||||
GLuint(_params.textureHandle),
|
GLenum(_params.textureTarget),
|
||||||
0);
|
GLuint(_params.textureHandle));
|
||||||
|
} else {
|
||||||
|
glFramebufferTexture2D(GLenum(_params.bufferTarget),
|
||||||
|
GLenum(_params.attachment),
|
||||||
|
GLenum(_params.textureTarget),
|
||||||
|
GLuint(_params.textureHandle),
|
||||||
|
0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -102,6 +140,16 @@ CreateFramebufferObject * BufferManipulationObjectFactory::getCreateFramebufferO
|
||||||
return new GenFramebuffer;
|
return new GenFramebuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CreateRenderbuffer * BufferManipulationObjectFactory::getCreateRenderbuffer() const
|
||||||
|
{
|
||||||
|
return new GenRenderbuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
InitRenderbuffer * BufferManipulationObjectFactory::getInitRenderbuffer() const
|
||||||
|
{
|
||||||
|
return new RenderbufferStorage(m_cachedFunctions.geCachedBindRenderbuffer());
|
||||||
|
}
|
||||||
|
|
||||||
AddFramebufferRenderTarget * BufferManipulationObjectFactory::getAddFramebufferRenderTarget() const
|
AddFramebufferRenderTarget * BufferManipulationObjectFactory::getAddFramebufferRenderTarget() const
|
||||||
{
|
{
|
||||||
if (AddNamedFramebufferTexture::Check(m_version))
|
if (AddNamedFramebufferTexture::Check(m_version))
|
||||||
|
|
|
@ -15,6 +15,19 @@ namespace opengl {
|
||||||
virtual graphics::ObjectHandle createFramebuffer() = 0;
|
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
|
class AddFramebufferRenderTarget
|
||||||
{
|
{
|
||||||
|
@ -32,6 +45,10 @@ namespace opengl {
|
||||||
|
|
||||||
CreateFramebufferObject * getCreateFramebufferObject() const;
|
CreateFramebufferObject * getCreateFramebufferObject() const;
|
||||||
|
|
||||||
|
CreateRenderbuffer * getCreateRenderbuffer() const;
|
||||||
|
|
||||||
|
InitRenderbuffer * getInitRenderbuffer() const;
|
||||||
|
|
||||||
AddFramebufferRenderTarget * getAddFramebufferRenderTarget() const;
|
AddFramebufferRenderTarget * getAddFramebufferRenderTarget() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -71,7 +71,8 @@ void CachedActiveTexture::setActiveTexture(u32 _index) {
|
||||||
/*---------------CachedFunctions-------------*/
|
/*---------------CachedFunctions-------------*/
|
||||||
|
|
||||||
CachedFunctions::CachedFunctions()
|
CachedFunctions::CachedFunctions()
|
||||||
: m_bindFramebuffer(glBindFramebuffer) {
|
: m_bindFramebuffer(glBindFramebuffer)
|
||||||
|
, m_bindRenderbuffer(glBindRenderbuffer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -114,3 +115,8 @@ CachedBindFramebuffer * CachedFunctions::geCachedBindFramebuffer()
|
||||||
{
|
{
|
||||||
return &m_bindFramebuffer;
|
return &m_bindFramebuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CachedBindRenderbuffer * CachedFunctions::geCachedBindRenderbuffer()
|
||||||
|
{
|
||||||
|
return &m_bindRenderbuffer;
|
||||||
|
}
|
||||||
|
|
|
@ -44,6 +44,8 @@ namespace opengl {
|
||||||
|
|
||||||
typedef CachedBind<decltype(glBindFramebuffer)> CachedBindFramebuffer;
|
typedef CachedBind<decltype(glBindFramebuffer)> CachedBindFramebuffer;
|
||||||
|
|
||||||
|
typedef CachedBind<decltype(glBindRenderbuffer)> CachedBindRenderbuffer;
|
||||||
|
|
||||||
class CachedBindTexture
|
class CachedBindTexture
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -87,6 +89,8 @@ namespace opengl {
|
||||||
|
|
||||||
CachedBindFramebuffer * geCachedBindFramebuffer();
|
CachedBindFramebuffer * geCachedBindFramebuffer();
|
||||||
|
|
||||||
|
CachedBindRenderbuffer * geCachedBindRenderbuffer();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef std::unordered_map<u32, CachedEnable> EnableParameters;
|
typedef std::unordered_map<u32, CachedEnable> EnableParameters;
|
||||||
|
|
||||||
|
@ -94,6 +98,7 @@ namespace opengl {
|
||||||
CachedBindTexture m_bindTexture;
|
CachedBindTexture m_bindTexture;
|
||||||
CachedActiveTexture m_activeTexture;
|
CachedActiveTexture m_activeTexture;
|
||||||
CachedBindFramebuffer m_bindFramebuffer;
|
CachedBindFramebuffer m_bindFramebuffer;
|
||||||
|
CachedBindRenderbuffer m_bindRenderbuffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,8 @@ void ContextImpl::init()
|
||||||
{
|
{
|
||||||
BufferManipulationObjectFactory bufferObjectFactory(m_version, *m_cachedFunctions.get());
|
BufferManipulationObjectFactory bufferObjectFactory(m_version, *m_cachedFunctions.get());
|
||||||
m_createFramebuffer.reset(bufferObjectFactory.getCreateFramebufferObject());
|
m_createFramebuffer.reset(bufferObjectFactory.getCreateFramebufferObject());
|
||||||
|
m_createRenderbuffer.reset(bufferObjectFactory.getCreateRenderbuffer());
|
||||||
|
m_initRenderbuffer.reset(bufferObjectFactory.getInitRenderbuffer());
|
||||||
m_addFramebufferRenderTarget.reset(bufferObjectFactory.getAddFramebufferRenderTarget());
|
m_addFramebufferRenderTarget.reset(bufferObjectFactory.getAddFramebufferRenderTarget());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,6 +49,8 @@ void ContextImpl::destroy()
|
||||||
m_set2DTextureParameters.reset(nullptr);
|
m_set2DTextureParameters.reset(nullptr);
|
||||||
|
|
||||||
m_createFramebuffer.reset(nullptr);
|
m_createFramebuffer.reset(nullptr);
|
||||||
|
m_createRenderbuffer.reset(nullptr);
|
||||||
|
m_initRenderbuffer.reset(nullptr);
|
||||||
m_addFramebufferRenderTarget.reset(nullptr);
|
m_addFramebufferRenderTarget.reset(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,6 +90,16 @@ void ContextImpl::deleteFramebuffer(graphics::ObjectHandle _name)
|
||||||
glDeleteFramebuffers(1, &fbo);
|
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)
|
void ContextImpl::addFrameBufferRenderTarget(const graphics::Context::FrameBufferRenderTarget & _params)
|
||||||
{
|
{
|
||||||
m_addFramebufferRenderTarget->addFrameBufferRenderTarget(_params);
|
m_addFramebufferRenderTarget->addFrameBufferRenderTarget(_params);
|
||||||
|
|
|
@ -30,6 +30,10 @@ namespace opengl {
|
||||||
|
|
||||||
void deleteFramebuffer(graphics::ObjectHandle _name) override;
|
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;
|
void addFrameBufferRenderTarget(const graphics::Context::FrameBufferRenderTarget & _params) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -39,6 +43,8 @@ namespace opengl {
|
||||||
std::unique_ptr<Set2DTextureParameters> m_set2DTextureParameters;
|
std::unique_ptr<Set2DTextureParameters> m_set2DTextureParameters;
|
||||||
|
|
||||||
std::unique_ptr<CreateFramebufferObject> m_createFramebuffer;
|
std::unique_ptr<CreateFramebufferObject> m_createFramebuffer;
|
||||||
|
std::unique_ptr<CreateRenderbuffer> m_createRenderbuffer;
|
||||||
|
std::unique_ptr<InitRenderbuffer> m_initRenderbuffer;
|
||||||
std::unique_ptr<AddFramebufferRenderTarget> m_addFramebufferRenderTarget;
|
std::unique_ptr<AddFramebufferRenderTarget> m_addFramebufferRenderTarget;
|
||||||
|
|
||||||
GLVersion m_version;
|
GLVersion m_version;
|
||||||
|
|
|
@ -28,6 +28,7 @@ namespace graphics {
|
||||||
namespace target {
|
namespace target {
|
||||||
Parameter TEXTURE_2D(GL_TEXTURE_2D);
|
Parameter TEXTURE_2D(GL_TEXTURE_2D);
|
||||||
Parameter TEXTURE_2D_MULTISAMPLE(GL_TEXTURE_2D_MULTISAMPLE);
|
Parameter TEXTURE_2D_MULTISAMPLE(GL_TEXTURE_2D_MULTISAMPLE);
|
||||||
|
Parameter RENDERBUFFER(GL_RENDERBUFFER);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace bufferTarget {
|
namespace bufferTarget {
|
||||||
|
@ -38,6 +39,7 @@ namespace graphics {
|
||||||
|
|
||||||
namespace bufferAttachment {
|
namespace bufferAttachment {
|
||||||
Parameter COLOR_ATTACHMENT0(GL_COLOR_ATTACHMENT0);
|
Parameter COLOR_ATTACHMENT0(GL_COLOR_ATTACHMENT0);
|
||||||
|
Parameter DEPTH_ATTACHMENT(GL_DEPTH_ATTACHMENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace enable {
|
namespace enable {
|
||||||
|
|
|
@ -17,7 +17,10 @@ namespace graphics {
|
||||||
explicit operator s32() const { return static_cast<s32>(m_iparameter); }
|
explicit operator s32() const { return static_cast<s32>(m_iparameter); }
|
||||||
explicit operator f32() const { return m_fparameter; }
|
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:
|
private:
|
||||||
union {
|
union {
|
||||||
u32 m_iparameter;
|
u32 m_iparameter;
|
||||||
|
|
|
@ -28,6 +28,7 @@ namespace graphics {
|
||||||
namespace target {
|
namespace target {
|
||||||
extern Parameter TEXTURE_2D;
|
extern Parameter TEXTURE_2D;
|
||||||
extern Parameter TEXTURE_2D_MULTISAMPLE;
|
extern Parameter TEXTURE_2D_MULTISAMPLE;
|
||||||
|
extern Parameter RENDERBUFFER;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace bufferTarget {
|
namespace bufferTarget {
|
||||||
|
@ -38,6 +39,7 @@ namespace graphics {
|
||||||
|
|
||||||
namespace bufferAttachment {
|
namespace bufferAttachment {
|
||||||
extern Parameter COLOR_ATTACHMENT0;
|
extern Parameter COLOR_ATTACHMENT0;
|
||||||
|
extern Parameter DEPTH_ATTACHMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace enable {
|
namespace enable {
|
||||||
|
|
|
@ -386,11 +386,6 @@ OGLRender::TexrectDrawer::TexrectDrawer()
|
||||||
|
|
||||||
void OGLRender::TexrectDrawer::init()
|
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 = textureCache().addFrameBufferTexture(false);
|
||||||
m_pTexture->format = G_IM_FMT_RGBA;
|
m_pTexture->format = G_IM_FMT_RGBA;
|
||||||
m_pTexture->clampS = 1;
|
m_pTexture->clampS = 1;
|
||||||
|
@ -413,6 +408,13 @@ void OGLRender::TexrectDrawer::init()
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
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
|
#else // GRAPHICS_CONTEXT
|
||||||
|
|
||||||
graphics::Context::InitTextureParams initParams;
|
graphics::Context::InitTextureParams initParams;
|
||||||
|
@ -431,9 +433,17 @@ void OGLRender::TexrectDrawer::init()
|
||||||
setParams.magFilter = graphics::textureParameters::FILTER_LINEAR;
|
setParams.magFilter = graphics::textureParameters::FILTER_LINEAR;
|
||||||
gfxContext.setTextureParameters(setParams);
|
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
|
#endif // GRAPHICS_CONTEXT
|
||||||
|
|
||||||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_pTexture->glName, 0);
|
|
||||||
// check if everything is OK
|
// check if everything is OK
|
||||||
assert(checkFBO());
|
assert(checkFBO());
|
||||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||||
|
|
|
@ -2147,7 +2147,7 @@ void _copyDepthBuffer()
|
||||||
if (pCopyBufferDepth == nullptr)
|
if (pCopyBufferDepth == nullptr)
|
||||||
return;
|
return;
|
||||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, pTmpBuffer->m_FBO);
|
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);
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbList.getCurrent()->m_FBO);
|
||||||
OGLVideo & ogl = video();
|
OGLVideo & ogl = video();
|
||||||
glBlitFramebuffer(
|
glBlitFramebuffer(
|
||||||
|
@ -2157,7 +2157,7 @@ void _copyDepthBuffer()
|
||||||
);
|
);
|
||||||
// Restore objects
|
// Restore objects
|
||||||
if (pTmpBuffer->m_pDepthBuffer != nullptr)
|
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);
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
|
||||||
// Set back current depth buffer
|
// Set back current depth buffer
|
||||||
dbList.saveBuffer(gDP.depthImageAddress);
|
dbList.saveBuffer(gDP.depthImageAddress);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user