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

Fix some TODO issues in FrameBuffer.cpp

This commit is contained in:
Sergey Lipskiy 2017-01-25 16:57:38 +07:00
parent 602e1dd859
commit c9f98d175c
4 changed files with 43 additions and 40 deletions

View File

@ -773,15 +773,17 @@ void FrameBufferList::attachDepthBuffer()
if (m_pCurrent->m_FBO.isNotNull() && pDepthBuffer != nullptr) { if (m_pCurrent->m_FBO.isNotNull() && pDepthBuffer != nullptr) {
pDepthBuffer->initDepthImageTexture(m_pCurrent); pDepthBuffer->initDepthImageTexture(m_pCurrent);
pDepthBuffer->initDepthBufferTexture(m_pCurrent); pDepthBuffer->initDepthBufferTexture(m_pCurrent);
#ifdef USE_DEPTH_RENDERBUFFER
// TODO bool goodDepthBufferTexture = false;
if (pDepthBuffer->m_depthRenderbufferWidth == m_pCurrent->m_pTexture->realWidth) { if (gfxContext.isSupported(SpecialFeatures::DepthFramebufferTextures)) {
#else goodDepthBufferTexture = gfxContext.isSupported(SpecialFeatures::WeakBlitFramebuffer) ?
const bool goodDepthBufferTexture = gfxContext.isSupported(SpecialFeatures::WeakBlitFramebuffer) ? pDepthBuffer->m_pDepthBufferTexture->realWidth == m_pCurrent->m_pTexture->realWidth :
pDepthBuffer->m_pDepthBufferTexture->realWidth == m_pCurrent->m_pTexture->realWidth : pDepthBuffer->m_pDepthBufferTexture->realWidth >= m_pCurrent->m_pTexture->realWidth;
pDepthBuffer->m_pDepthBufferTexture->realWidth >= m_pCurrent->m_pTexture->realWidth; } else {
goodDepthBufferTexture = pDepthBuffer->m_depthRenderbufferWidth == m_pCurrent->m_pTexture->realWidth;
}
if (goodDepthBufferTexture) { if (goodDepthBufferTexture) {
#endif // USE_DEPTH_RENDERBUFFER
m_pCurrent->m_pDepthBuffer = pDepthBuffer; m_pCurrent->m_pDepthBuffer = pDepthBuffer;
pDepthBuffer->setDepthAttachment(m_pCurrent->m_FBO, bufferTarget::DRAW_FRAMEBUFFER); pDepthBuffer->setDepthAttachment(m_pCurrent->m_FBO, bufferTarget::DRAW_FRAMEBUFFER);
if (Context::imageTextures && config.frameBufferEmulation.N64DepthCompare != 0) if (Context::imageTextures && config.frameBufferEmulation.N64DepthCompare != 0)
@ -930,16 +932,9 @@ void FrameBufferList::renderBuffer(u32 _address)
vOffset + (s32)(dstY0*dstScaleY), vOffset + (s32)(dstY0*dstScaleY),
hOffset + X1, hOffset + X1,
vOffset + (s32)(dstY1*dstScaleY) }; vOffset + (s32)(dstY1*dstScaleY) };
#if 0 //def GLESX
// TODO fix me
if (render.getRenderer() == OGLRender::glrAdreno)
dstCoord[0] += 1; // workaround for Adreno's issue with glBindFramebuffer;
#endif // GLESX
// glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
gfxContext.bindFramebuffer(bufferTarget::DRAW_FRAMEBUFFER, ObjectHandle()); gfxContext.bindFramebuffer(bufferTarget::DRAW_FRAMEBUFFER, ObjectHandle());
//glDrawBuffer( GL_BACK );
float clearColor[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; float clearColor[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
drawer.clearColorBuffer(clearColor); drawer.clearColorBuffer(clearColor);
@ -952,20 +947,15 @@ void FrameBufferList::renderBuffer(u32 _address)
(srcCoord[2] - srcCoord[0]) != (dstCoord[2] - dstCoord[0]) || (srcCoord[2] - srcCoord[0]) != (dstCoord[2] - dstCoord[0]) ||
(srcCoord[3] - srcCoord[1]) != (dstCoord[3] - dstCoord[1])) { (srcCoord[3] - srcCoord[1]) != (dstCoord[3] - dstCoord[1])) {
pFilteredBuffer->resolveMultisampledTexture(true); pFilteredBuffer->resolveMultisampledTexture(true);
//glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_resolveFBO);
readBuffer = ObjectHandle(pFilteredBuffer->m_resolveFBO); readBuffer = ObjectHandle(pFilteredBuffer->m_resolveFBO);
} else { } else {
// glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_FBO);
readBuffer = ObjectHandle(pFilteredBuffer->m_FBO); readBuffer = ObjectHandle(pFilteredBuffer->m_FBO);
filter = textureParameters::FILTER_NEAREST; filter = textureParameters::FILTER_NEAREST;
} }
} else { } else {
readBuffer = ObjectHandle(pFilteredBuffer->m_FBO); readBuffer = ObjectHandle(pFilteredBuffer->m_FBO);
// glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_FBO);
} }
// glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
GraphicsDrawer::BlitOrCopyRectParams blitParams; GraphicsDrawer::BlitOrCopyRectParams blitParams;
blitParams.srcX0 = srcCoord[0]; blitParams.srcX0 = srcCoord[0];
blitParams.srcY0 = srcCoord[1]; blitParams.srcY0 = srcCoord[1];
@ -1000,14 +990,10 @@ void FrameBufferList::renderBuffer(u32 _address)
if (pFilteredBuffer->m_pTexture->frameBufferTexture == CachedTexture::fbMultiSample) { if (pFilteredBuffer->m_pTexture->frameBufferTexture == CachedTexture::fbMultiSample) {
pFilteredBuffer->resolveMultisampledTexture(); pFilteredBuffer->resolveMultisampledTexture();
readBuffer = ObjectHandle(pFilteredBuffer->m_resolveFBO); readBuffer = ObjectHandle(pFilteredBuffer->m_resolveFBO);
// glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_resolveFBO);
} else { } else {
// glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_FBO);
readBuffer = ObjectHandle(pFilteredBuffer->m_FBO); readBuffer = ObjectHandle(pFilteredBuffer->m_FBO);
} }
// glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
pBufferTexture = pFilteredBuffer->m_pTexture; pBufferTexture = pFilteredBuffer->m_pTexture;
blitParams.srcX0 = 0; blitParams.srcX0 = 0;
@ -1129,8 +1115,6 @@ bool FrameBuffer_CopyDepthBufferChunk(u32 address)
void FrameBuffer_CopyFromRDRAM(u32 _address, bool _bCFB) void FrameBuffer_CopyFromRDRAM(u32 _address, bool _bCFB)
{ {
// TODO fix me
return;
RDRAMtoColorBuffer::get().copyFromRDRAM(_address, _bCFB); RDRAMtoColorBuffer::get().copyFromRDRAM(_address, _bCFB);
} }

View File

@ -301,16 +301,21 @@ public:
return !_glinfo.isGLES2; return !_glinfo.isGLES2;
} }
BlitFramebuffersImpl(CachedBindFramebuffer * _bind) BlitFramebuffersImpl(CachedBindFramebuffer * _bind, Renderer _renderer)
: m_bind(_bind) {} : m_bind(_bind)
, m_renderer(_renderer) {
}
bool blitFramebuffers(const graphics::Context::BlitFramebuffersParams & _params) override bool blitFramebuffers(const graphics::Context::BlitFramebuffersParams & _params) override
{ {
m_bind->bind(graphics::bufferTarget::READ_FRAMEBUFFER, _params.readBuffer); m_bind->bind(graphics::bufferTarget::READ_FRAMEBUFFER, _params.readBuffer);
m_bind->bind(graphics::bufferTarget::DRAW_FRAMEBUFFER, _params.drawBuffer); m_bind->bind(graphics::bufferTarget::DRAW_FRAMEBUFFER, _params.drawBuffer);
const s32 adrenoCoordFix = (m_renderer == Renderer::Adreno) ? 1 : 0;
glBlitFramebuffer( glBlitFramebuffer(
_params.srcX0, _params.srcY0, _params.srcX1, _params.srcY1, _params.srcX0, _params.srcY0, _params.srcX1, _params.srcY1,
_params.dstX0, _params.dstY0, _params.dstX1, _params.dstY1, adrenoCoordFix +_params.dstX0, _params.dstY0, _params.dstX1, _params.dstY1,
GLbitfield(_params.mask), GLenum(_params.filter) GLbitfield(_params.mask), GLenum(_params.filter)
); );
return !Utils::isGLError(); return !Utils::isGLError();
@ -318,6 +323,7 @@ public:
private: private:
CachedBindFramebuffer * m_bind; CachedBindFramebuffer * m_bind;
Renderer m_renderer;
}; };
class DummyBlitFramebuffers: public BlitFramebuffers class DummyBlitFramebuffers: public BlitFramebuffers
@ -501,7 +507,7 @@ AddFramebufferRenderTarget * BufferManipulationObjectFactory::getAddFramebufferR
BlitFramebuffers * BufferManipulationObjectFactory::getBlitFramebuffers() const BlitFramebuffers * BufferManipulationObjectFactory::getBlitFramebuffers() const
{ {
if (BlitFramebuffersImpl::Check(m_glInfo)) if (BlitFramebuffersImpl::Check(m_glInfo))
return new BlitFramebuffersImpl(m_cachedFunctions.getCachedBindFramebuffer()); return new BlitFramebuffersImpl(m_cachedFunctions.getCachedBindFramebuffer(), m_glInfo.renderer);
return new DummyBlitFramebuffers; return new DummyBlitFramebuffers;
} }

View File

@ -20,6 +20,13 @@ void GLInfo::init() {
LOG(LOG_VERBOSE, "%s major version: %d\n", isGLESX ? "OpenGL ES" : "OpenGL", majorVersion); LOG(LOG_VERBOSE, "%s major version: %d\n", isGLESX ? "OpenGL ES" : "OpenGL", majorVersion);
LOG(LOG_VERBOSE, "%s minor version: %d\n", isGLESX ? "OpenGL ES" : "OpenGL", minorVersion); LOG(LOG_VERBOSE, "%s minor version: %d\n", isGLESX ? "OpenGL ES" : "OpenGL", minorVersion);
LOG(LOG_VERBOSE, "OpenGL vendor: %s\n", glGetString(GL_VENDOR));
const GLubyte * strRenderer = glGetString(GL_RENDERER);
if (strstr((const char*)strRenderer, "Adreno") != nullptr)
renderer = Renderer::Adreno;
LOG(LOG_VERBOSE, "OpenGL renderer: %s\n", strRenderer);
if (isGLES2) { if (isGLES2) {
imageTextures = false; imageTextures = false;
msaa = false; msaa = false;

View File

@ -3,15 +3,21 @@
namespace opengl { namespace opengl {
struct GLInfo { enum class Renderer {
GLint majorVersion = 0; Adreno,
GLint minorVersion = 0; Other
bool isGLES2 = false; };
bool isGLESX = false;
bool imageTextures = false;
bool shaderStorage = false;
bool msaa = false;
void init(); struct GLInfo {
}; GLint majorVersion = 0;
GLint minorVersion = 0;
bool isGLES2 = false;
bool isGLESX = false;
bool imageTextures = false;
bool shaderStorage = false;
bool msaa = false;
Renderer renderer = Renderer::Other;
void init();
};
} }