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

Implement Context::blitFramebuffers

This commit is contained in:
Sergey Lipskiy 2017-01-14 17:08:02 +07:00
parent 704378777d
commit 5e67d79ae7
11 changed files with 144 additions and 9 deletions

View File

@ -98,6 +98,8 @@ void Context::setTextureParameters(const TexParameters & _parameters)
m_impl->setTextureParameters(_parameters);
}
/*---------------Framebuffer-------------*/
ObjectHandle Context::createFramebuffer()
{
return m_impl->createFramebuffer();
@ -123,11 +125,18 @@ void Context::addFrameBufferRenderTarget(const FrameBufferRenderTarget & _params
m_impl->addFrameBufferRenderTarget(_params);
}
bool Context::blitFramebuffers(const BlitFramebuffersParams & _params)
{
return m_impl->blitFramebuffers(_params);
}
PixelWriteBuffer * Context::createPixelWriteBuffer(size_t _sizeInBytes)
{
return m_impl->createPixelWriteBuffer(_sizeInBytes);
}
/*---------------Shaders-------------*/
CombinerProgram * Context::createCombinerProgram(Combiner & _color, Combiner & _alpha, const CombinerKey & _key)
{
return m_impl->createCombinerProgram(_color, _alpha, _key);

View File

@ -131,6 +131,24 @@ namespace graphics {
void addFrameBufferRenderTarget(const FrameBufferRenderTarget & _params);
struct BlitFramebuffersParams
{
ObjectHandle readBuffer;
ObjectHandle drawBuffer;
s32 srcX0;
s32 srcY0;
s32 srcX1;
s32 srcY1;
s32 dstX0;
s32 dstY0;
s32 dstX1;
s32 dstY1;
Parameter mask;
Parameter filter;
};
bool blitFramebuffers(const BlitFramebuffersParams & _params);
PixelWriteBuffer * createPixelWriteBuffer(size_t _sizeInBytes);
/*---------------Shaders-------------*/

View File

@ -32,6 +32,7 @@ namespace graphics {
virtual void addFrameBufferRenderTarget(const Context::FrameBufferRenderTarget & _params) = 0;
virtual ObjectHandle createRenderbuffer() = 0;
virtual void initRenderbuffer(const Context::InitRenderbufferParams & _params) = 0;
virtual bool blitFramebuffers(const Context::BlitFramebuffersParams & _params) = 0;
virtual PixelWriteBuffer * createPixelWriteBuffer(size_t _sizeInBytes) = 0;
virtual CombinerProgram * createCombinerProgram(Combiner & _color, Combiner & _alpha, const CombinerKey & _key) = 0;
virtual bool saveShadersStorage(const Combiners & _combiners) = 0;

View File

@ -1,6 +1,7 @@
#include <Graphics/Parameters.h>
#include "opengl_GLInfo.h"
#include "opengl_CachedFunctions.h"
#include "opengl_Utils.h"
#include "opengl_BufferManipulationObjectFactory.h"
//#define ENABLE_GL_4_5
@ -221,6 +222,43 @@ private:
CachedBindBuffer * m_bind;
};
/*---------------BlitFramebuffers-------------*/
class BlitFramebuffersImpl : public BlitFramebuffers
{
public:
static bool Check(const GLInfo & _glinfo) {
return !_glinfo.isGLES2;
}
BlitFramebuffersImpl(CachedBindFramebuffer * _bind)
: m_bind(_bind) {}
bool blitFramebuffers(const graphics::Context::BlitFramebuffersParams & _params) override
{
m_bind->bind(graphics::bufferTarget::READ_FRAMEBUFFER, _params.readBuffer);
m_bind->bind(graphics::bufferTarget::DRAW_FRAMEBUFFER, _params.drawBuffer);
glBlitFramebuffer(
_params.srcX0, _params.srcY0, _params.srcX1, _params.srcY1,
_params.dstX0, _params.dstY0, _params.dstX1, _params.dstY1,
GLbitfield(_params.mask), GLenum(_params.filter)
);
return !Utils::isGLError();
}
private:
CachedBindFramebuffer * m_bind;
};
class DummyBlitFramebuffers: public BlitFramebuffers
{
public:
bool blitFramebuffers(const graphics::Context::BlitFramebuffersParams & _params) override
{
return false;
}
};
/*---------------BufferManipulationObjectFactory-------------*/
BufferManipulationObjectFactory::BufferManipulationObjectFactory(const GLInfo & _info,
@ -261,6 +299,14 @@ AddFramebufferRenderTarget * BufferManipulationObjectFactory::getAddFramebufferR
return new AddFramebufferTexture2D(m_cachedFunctions.geCachedBindFramebuffer());
}
BlitFramebuffers * BufferManipulationObjectFactory::getBlitFramebuffers() const
{
if (BlitFramebuffersImpl::Check(m_glInfo))
return new BlitFramebuffersImpl(m_cachedFunctions.geCachedBindFramebuffer());
return new DummyBlitFramebuffers;
}
CreatePixelWriteBuffer * BufferManipulationObjectFactory::createPixelWriteBuffer() const
{
if (m_glInfo.isGLES2)

View File

@ -13,38 +13,45 @@ namespace opengl {
class CreateFramebufferObject
{
public:
virtual ~CreateFramebufferObject() {};
virtual ~CreateFramebufferObject() {}
virtual graphics::ObjectHandle createFramebuffer() = 0;
};
class CreateRenderbuffer
{
public:
virtual ~CreateRenderbuffer() {};
virtual ~CreateRenderbuffer() {}
virtual graphics::ObjectHandle createRenderbuffer() = 0;
};
class InitRenderbuffer
{
public:
virtual ~InitRenderbuffer() {};
virtual ~InitRenderbuffer() {}
virtual void initRenderbuffer(const graphics::Context::InitRenderbufferParams & _params) = 0;
};
class AddFramebufferRenderTarget
{
public:
virtual ~AddFramebufferRenderTarget() {};
virtual ~AddFramebufferRenderTarget() {}
virtual void addFrameBufferRenderTarget(const graphics::Context::FrameBufferRenderTarget & _params) = 0;
};
class CreatePixelWriteBuffer
{
public:
virtual ~CreatePixelWriteBuffer() {};
virtual ~CreatePixelWriteBuffer() {}
virtual graphics::PixelWriteBuffer * createPixelWriteBuffer(size_t _sizeInBytes) = 0;
};
class BlitFramebuffers
{
public:
virtual ~BlitFramebuffers() {}
virtual bool blitFramebuffers(const graphics::Context::BlitFramebuffersParams & _params) = 0;
};
class BufferManipulationObjectFactory
{
public:
@ -61,6 +68,8 @@ namespace opengl {
CreatePixelWriteBuffer * createPixelWriteBuffer() const;
BlitFramebuffers * getBlitFramebuffers() const;
private:
const GLInfo & m_glInfo;
CachedFunctions & m_cachedFunctions;

View File

@ -42,6 +42,7 @@ void ContextImpl::init()
m_initRenderbuffer.reset(bufferObjectFactory.getInitRenderbuffer());
m_addFramebufferRenderTarget.reset(bufferObjectFactory.getAddFramebufferRenderTarget());
m_createPixelWriteBuffer.reset(bufferObjectFactory.createPixelWriteBuffer());
m_blitFramebuffers.reset(bufferObjectFactory.getBlitFramebuffers());
}
{
@ -136,6 +137,8 @@ void ContextImpl::clearDepthBuffer()
enableScissor->enable(true);
}
/*---------------Texture-------------*/
graphics::ObjectHandle ContextImpl::createTexture(graphics::Parameter _target)
{
return m_createTexture->createTexture(_target);
@ -163,6 +166,8 @@ void ContextImpl::setTextureParameters(const graphics::Context::TexParameters &
m_set2DTextureParameters->setTextureParameters(_parameters);
}
/*---------------Framebuffer-------------*/
graphics::ObjectHandle ContextImpl::createFramebuffer()
{
return m_createFramebuffer->createFramebuffer();
@ -190,11 +195,18 @@ void ContextImpl::addFrameBufferRenderTarget(const graphics::Context::FrameBuffe
m_addFramebufferRenderTarget->addFrameBufferRenderTarget(_params);
}
bool ContextImpl::blitFramebuffers(const graphics::Context::BlitFramebuffersParams & _params)
{
return m_blitFramebuffers->blitFramebuffers(_params);
}
graphics::PixelWriteBuffer * ContextImpl::createPixelWriteBuffer(size_t _sizeInBytes)
{
return m_createPixelWriteBuffer->createPixelWriteBuffer(_sizeInBytes);
}
/*---------------Shaders-------------*/
graphics::CombinerProgram * ContextImpl::createCombinerProgram(Combiner & _color, Combiner & _alpha, const CombinerKey & _key)
{
return m_combinerProgramBuilder->buildCombinerProgram(_color, _alpha, _key);

View File

@ -44,6 +44,8 @@ namespace opengl {
void clearDepthBuffer() override;
/*---------------Texture-------------*/
graphics::ObjectHandle createTexture(graphics::Parameter _target) override;
void deleteTexture(graphics::ObjectHandle _name) override;
@ -54,6 +56,8 @@ namespace opengl {
void setTextureParameters(const graphics::Context::TexParameters & _parameters) override;
/*---------------Framebuffer-------------*/
graphics::ObjectHandle createFramebuffer() override;
void deleteFramebuffer(graphics::ObjectHandle _name) override;
@ -64,8 +68,12 @@ namespace opengl {
void addFrameBufferRenderTarget(const graphics::Context::FrameBufferRenderTarget & _params) override;
bool blitFramebuffers(const graphics::Context::BlitFramebuffersParams & _params) override;
graphics::PixelWriteBuffer * createPixelWriteBuffer(size_t _sizeInBytes) override;
/*---------------Shaders-------------*/
graphics::CombinerProgram * createCombinerProgram(Combiner & _color, Combiner & _alpha, const CombinerKey & _key) override;
bool saveShadersStorage(const graphics::Combiners & _combiners) override;
@ -106,6 +114,7 @@ namespace opengl {
std::unique_ptr<InitRenderbuffer> m_initRenderbuffer;
std::unique_ptr<AddFramebufferRenderTarget> m_addFramebufferRenderTarget;
std::unique_ptr<CreatePixelWriteBuffer> m_createPixelWriteBuffer;
std::unique_ptr<BlitFramebuffers> m_blitFramebuffers;
std::unique_ptr<GraphicsDrawer> m_graphicsDrawer;
std::unique_ptr<TextDrawer> m_textDrawer;

View File

@ -1471,4 +1471,26 @@ void GraphicsDrawer::copyTexturedRect(const CopyRectParams & _params)
gSP.changed |= CHANGED_GEOMETRYMODE | CHANGED_VIEWPORT;
gDP.changed |= CHANGED_RENDERMODE | CHANGED_TILE | CHANGED_COMBINE | CHANGED_SCISSOR;
}
}
void GraphicsDrawer::blitOrCopyTexturedRect(const BlitOrCopyRectParams & _params)
{
Context::BlitFramebuffersParams blitParams;
blitParams.readBuffer = _params.readBuffer;
blitParams.drawBuffer = _params.drawBuffer;
blitParams.srcX0 = _params.srcX0;
blitParams.srcX1 = _params.srcX1;
blitParams.dstX0 = _params.dstX0;
blitParams.dstX1 = _params.dstX1;
blitParams.srcY0 = _params.srcY0;
blitParams.srcY1 = _params.srcY1;
blitParams.dstY0 = _params.dstY0;
blitParams.dstY1 = _params.dstY1;
blitParams.mask = _params.mask;
blitParams.filter = _params.filter;
if (gfxContext.blitFramebuffers(blitParams))
return;
copyTexturedRect(_params);
}

View File

@ -3,6 +3,7 @@
#include <array>
#include <vector>
#include "gSP.h"
#include "Graphics/ObjectHandle.h"
#include "Graphics/Parameter.h"
namespace graphics {
@ -99,6 +100,15 @@ public:
void copyTexturedRect(const CopyRectParams & _params);
struct BlitOrCopyRectParams : public CopyRectParams
{
graphics::ObjectHandle readBuffer;
graphics::ObjectHandle drawBuffer;
graphics::Parameter mask;
};
void blitOrCopyTexturedRect(const BlitOrCopyRectParams & _params);
void drawText(const char *_pText, float x, float y);
void drawOSD();

View File

@ -58,7 +58,7 @@ typedef char GLchar;
#include "common/GLFunctions.h"
#define GL_IMAGE_TEXTURES_SUPPORT
#define GL_MULTISAMPLING_SUPPORT
#define NO_BLIT_BUFFER_COPY
//#define NO_BLIT_BUFFER_COPY
#endif // OS_MAC_OS_X
#endif // GLES2

View File

@ -10,8 +10,7 @@
#include <Graphics/Context.h>
#include <Graphics/Parameters.h>
#define NEW_POST_PROCESSOR
//#define NEW_POST_PROCESSOR
#if defined(GLES3_1)
#define SHADER_VERSION "#version 310 es \n"