1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-04 10:03:36 +00:00

Implement FramebufferTextureFormats

This commit is contained in:
Sergey Lipskiy 2017-01-16 20:55:57 +07:00
parent 5e67d79ae7
commit a30c317c4b
10 changed files with 221 additions and 9 deletions

View File

@ -438,6 +438,7 @@
<ClInclude Include="..\..\src\Graphics\CombinerProgram.h" />
<ClInclude Include="..\..\src\Graphics\Context.h" />
<ClInclude Include="..\..\src\Graphics\ContextImpl.h" />
<ClInclude Include="..\..\src\Graphics\FramebufferTextureFormats.h" />
<ClInclude Include="..\..\src\Graphics\ObjectHandle.h" />
<ClInclude Include="..\..\src\Graphics\OpenGLContext\GLFunctions.h" />
<ClInclude Include="..\..\src\Graphics\OpenGLContext\GLSL\glsl_CombinerInputs.h" />

View File

@ -643,5 +643,8 @@
<ClInclude Include="..\..\src\Graphics\OpenGLContext\opengl_GraphicsDrawer.h">
<Filter>Header Files\Graphics\OpenGL</Filter>
</ClInclude>
<ClInclude Include="..\..\src\Graphics\FramebufferTextureFormats.h">
<Filter>Header Files\Graphics</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -15,6 +15,7 @@ void Context::init()
{
m_impl.reset(new opengl::ContextImpl);
m_impl->init();
m_fbTexFormats.reset(m_impl->getFramebufferTextureFormats());
}
void Context::destroy()
@ -100,6 +101,11 @@ void Context::setTextureParameters(const TexParameters & _parameters)
/*---------------Framebuffer-------------*/
const FramebufferTextureFormats & Context::getFramebufferTextureFormats()
{
return *m_fbTexFormats.get();
}
ObjectHandle Context::createFramebuffer()
{
return m_impl->createFramebuffer();

View File

@ -7,6 +7,7 @@
#include "CombinerProgram.h"
#include "ShaderProgram.h"
#include "PixelBuffer.h"
#include "FramebufferTextureFormats.h"
#define GRAPHICS_CONTEXT
@ -105,6 +106,8 @@ namespace graphics {
/*---------------Framebuffer-------------*/
const FramebufferTextureFormats & getFramebufferTextureFormats();
ObjectHandle createFramebuffer();
void deleteFramebuffer(ObjectHandle _name);
@ -210,6 +213,7 @@ namespace graphics {
private:
std::unique_ptr<ContextImpl> m_impl;
std::unique_ptr<FramebufferTextureFormats> m_fbTexFormats;
};
}

View File

@ -27,6 +27,7 @@ namespace graphics {
virtual void init2DTexture(const Context::InitTextureParams & _params) = 0;
virtual void update2DTexture(const Context::UpdateTextureDataParams & _params) = 0;
virtual void setTextureParameters(const Context::TexParameters & _parameters) = 0;
virtual FramebufferTextureFormats * getFramebufferTextureFormats() = 0;
virtual ObjectHandle createFramebuffer() = 0;
virtual void deleteFramebuffer(ObjectHandle _name) = 0;
virtual void addFrameBufferRenderTarget(const Context::FrameBufferRenderTarget & _params) = 0;

View File

@ -0,0 +1,41 @@
#ifndef GRAPHICS_FRAMEBUFFER_TEXTUREFORMATS_H
#define GRAPHICS_FRAMEBUFFER_TEXTUREFORMATS_H
#include "Parameter.h"
namespace graphics {
struct FramebufferTextureFormats
{
Parameter colorInternalFormat;
Parameter colorFormat;
Parameter colorType;
u32 colorFormatBytes;
Parameter monochromeInternalFormat;
Parameter monochromeFormat;
Parameter monochromeType;
u32 monochromeFormatBytes;
Parameter depthInternalFormat;
Parameter depthFormat;
Parameter depthType;
u32 depthFormatBytes;
Parameter depthImageInternalFormat;
Parameter depthImageFormat;
Parameter depthImageType;
u32 depthImageFormatBytes;
Parameter lutInternalFormat;
Parameter lutFormat;
Parameter lutType;
u32 lutFormatBytes;
virtual ~FramebufferTextureFormats() {}
protected:
virtual void init() = 0;
};
}
#endif // GRAPHICS_FRAMEBUFFER_TEXTUREFORMATS_H

View File

@ -1,3 +1,4 @@
#include <assert.h>
#include <Graphics/Parameters.h>
#include "opengl_GLInfo.h"
#include "opengl_CachedFunctions.h"
@ -259,6 +260,135 @@ public:
}
};
/*---------------FramebufferTextureFormats-------------*/
struct FramebufferTextureFormatsGLES2 : public graphics::FramebufferTextureFormats
{
static bool Check(const GLInfo & _glinfo) {
return _glinfo.isGLES2;
}
FramebufferTextureFormatsGLES2()
{
init();
}
protected:
void init() override
{
monochromeInternalFormat = GL_RGB;
monochromeFormat = GL_RGB;
monochromeType = GL_UNSIGNED_SHORT_5_6_5;
monochromeFormatBytes = 2;
#ifndef USE_DEPTH_RENDERBUFFER
depthInternalFormat = GL_DEPTH_COMPONENT;
depthFormatBytes = 4;
#else
depthInternalFormat = GL_DEPTH_COMPONENT16;
depthFormatBytes = 2;
#endif
depthFormat = GL_DEPTH_COMPONENT;
depthType = GL_UNSIGNED_INT;
if (Utils::isExtensionSupported("GL_OES_rgb8_rgba8")) {
colorInternalFormat = GL_RGBA;
colorFormat = GL_RGBA;
colorType = GL_UNSIGNED_BYTE;
colorFormatBytes = 4;
}
else {
colorInternalFormat = GL_RGB;
colorFormat = GL_RGB;
colorType = GL_UNSIGNED_SHORT_5_6_5;
colorFormatBytes = 2;
}
}
};
struct FramebufferTextureFormatsGLES3 : public graphics::FramebufferTextureFormats
{
static bool Check(const GLInfo & _glinfo) {
return _glinfo.isGLESX && !_glinfo.isGLES2;
}
FramebufferTextureFormatsGLES3()
{
init();
}
protected:
void init() override
{
colorInternalFormat = GL_RGBA8;
colorFormat = GL_RGBA;
colorType = GL_UNSIGNED_BYTE;
colorFormatBytes = 4;
monochromeInternalFormat = GL_R8;
monochromeFormat = GL_RED;
monochromeType = GL_UNSIGNED_BYTE;
monochromeFormatBytes = 1;
depthInternalFormat = GL_DEPTH_COMPONENT24;
depthFormat = GL_DEPTH_COMPONENT;
depthType = GL_UNSIGNED_INT;
depthFormatBytes = 4;
depthImageInternalFormat = GL_RGBA32F;
depthImageFormat = GL_RGBA;
depthImageType = GL_FLOAT;
depthImageFormatBytes = 16;
lutInternalFormat = GL_R32UI;
lutFormat = GL_RED_INTEGER;
lutType = GL_UNSIGNED_INT;
lutFormatBytes = 4;
}
};
struct FramebufferTextureFormatsOpenGL : public graphics::FramebufferTextureFormats
{
static bool Check(const GLInfo & _glinfo) {
return !_glinfo.isGLESX;
}
FramebufferTextureFormatsOpenGL()
{
init();
}
protected:
void init() override
{
colorInternalFormat = GL_RGBA;
colorFormat = GL_RGBA;
colorType = GL_UNSIGNED_BYTE;
colorFormatBytes = 4;
monochromeInternalFormat = GL_RED;
monochromeFormat = GL_RED;
monochromeType = GL_UNSIGNED_BYTE;
monochromeFormatBytes = 1;
depthInternalFormat = GL_DEPTH_COMPONENT;
depthFormat = GL_DEPTH_COMPONENT;
depthType = GL_FLOAT;
depthFormatBytes = 4;
depthImageInternalFormat = GL_RG32F;
depthImageFormat = GL_RG;
depthImageType = GL_FLOAT;
depthImageFormatBytes = 8;
lutInternalFormat = GL_R16;
lutFormat = GL_RED;
lutType = GL_UNSIGNED_SHORT;
lutFormatBytes = 2;
}
};
/*---------------BufferManipulationObjectFactory-------------*/
BufferManipulationObjectFactory::BufferManipulationObjectFactory(const GLInfo & _info,
@ -314,3 +444,18 @@ CreatePixelWriteBuffer * BufferManipulationObjectFactory::createPixelWriteBuffer
return new CreatePixelWriteBufferT<PBOWriteBuffer>(m_cachedFunctions.geCachedBindBuffer());
}
graphics::FramebufferTextureFormats * BufferManipulationObjectFactory::getFramebufferTextureFormats() const
{
if (FramebufferTextureFormatsOpenGL::Check(m_glInfo))
return new FramebufferTextureFormatsOpenGL;
if (FramebufferTextureFormatsGLES3::Check(m_glInfo))
return new FramebufferTextureFormatsGLES3;
if (FramebufferTextureFormatsGLES2::Check(m_glInfo))
return new FramebufferTextureFormatsGLES2;
assert(false);
return nullptr;
}

View File

@ -70,6 +70,8 @@ namespace opengl {
BlitFramebuffers * getBlitFramebuffers() const;
graphics::FramebufferTextureFormats * getFramebufferTextureFormats() const;
private:
const GLInfo & m_glInfo;
CachedFunctions & m_cachedFunctions;

View File

@ -37,6 +37,7 @@ void ContextImpl::init()
{
BufferManipulationObjectFactory bufferObjectFactory(m_glInfo, *m_cachedFunctions.get());
m_fbTexFormats.reset(bufferObjectFactory.getFramebufferTextureFormats());
m_createFramebuffer.reset(bufferObjectFactory.getCreateFramebufferObject());
m_createRenderbuffer.reset(bufferObjectFactory.getCreateRenderbuffer());
m_initRenderbuffer.reset(bufferObjectFactory.getInitRenderbuffer());
@ -55,18 +56,18 @@ void ContextImpl::init()
void ContextImpl::destroy()
{
m_cachedFunctions.reset(nullptr);
m_createTexture.reset(nullptr);
m_init2DTexture.reset(nullptr);
m_set2DTextureParameters.reset(nullptr);
m_cachedFunctions.reset();
m_createTexture.reset();
m_init2DTexture.reset();
m_set2DTextureParameters.reset();
m_createFramebuffer.reset(nullptr);
m_createRenderbuffer.reset(nullptr);
m_initRenderbuffer.reset(nullptr);
m_addFramebufferRenderTarget.reset(nullptr);
m_createFramebuffer.reset();
m_createRenderbuffer.reset();
m_initRenderbuffer.reset();
m_addFramebufferRenderTarget.reset();
m_combinerProgramBuilder.reset(nullptr);
m_combinerProgramBuilder.reset();
}
void ContextImpl::enable(graphics::Parameter _parameter, bool _enable)
@ -168,6 +169,11 @@ void ContextImpl::setTextureParameters(const graphics::Context::TexParameters &
/*---------------Framebuffer-------------*/
graphics::FramebufferTextureFormats * ContextImpl::getFramebufferTextureFormats()
{
return m_fbTexFormats.release();
}
graphics::ObjectHandle ContextImpl::createFramebuffer()
{
return m_createFramebuffer->createFramebuffer();

View File

@ -58,6 +58,8 @@ namespace opengl {
/*---------------Framebuffer-------------*/
graphics::FramebufferTextureFormats * getFramebufferTextureFormats() override;
graphics::ObjectHandle createFramebuffer() override;
void deleteFramebuffer(graphics::ObjectHandle _name) override;
@ -115,6 +117,7 @@ namespace opengl {
std::unique_ptr<AddFramebufferRenderTarget> m_addFramebufferRenderTarget;
std::unique_ptr<CreatePixelWriteBuffer> m_createPixelWriteBuffer;
std::unique_ptr<BlitFramebuffers> m_blitFramebuffers;
std::unique_ptr<graphics::FramebufferTextureFormats> m_fbTexFormats;
std::unique_ptr<GraphicsDrawer> m_graphicsDrawer;
std::unique_ptr<TextDrawer> m_textDrawer;