1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +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) {
pDepthBuffer->initDepthImageTexture(m_pCurrent);
pDepthBuffer->initDepthBufferTexture(m_pCurrent);
#ifdef USE_DEPTH_RENDERBUFFER
// TODO
if (pDepthBuffer->m_depthRenderbufferWidth == m_pCurrent->m_pTexture->realWidth) {
#else
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;
bool goodDepthBufferTexture = false;
if (gfxContext.isSupported(SpecialFeatures::DepthFramebufferTextures)) {
goodDepthBufferTexture = gfxContext.isSupported(SpecialFeatures::WeakBlitFramebuffer) ?
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) {
#endif // USE_DEPTH_RENDERBUFFER
m_pCurrent->m_pDepthBuffer = pDepthBuffer;
pDepthBuffer->setDepthAttachment(m_pCurrent->m_FBO, bufferTarget::DRAW_FRAMEBUFFER);
if (Context::imageTextures && config.frameBufferEmulation.N64DepthCompare != 0)
@ -930,16 +932,9 @@ void FrameBufferList::renderBuffer(u32 _address)
vOffset + (s32)(dstY0*dstScaleY),
hOffset + X1,
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());
//glDrawBuffer( GL_BACK );
float clearColor[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
drawer.clearColorBuffer(clearColor);
@ -952,20 +947,15 @@ void FrameBufferList::renderBuffer(u32 _address)
(srcCoord[2] - srcCoord[0]) != (dstCoord[2] - dstCoord[0]) ||
(srcCoord[3] - srcCoord[1]) != (dstCoord[3] - dstCoord[1])) {
pFilteredBuffer->resolveMultisampledTexture(true);
//glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_resolveFBO);
readBuffer = ObjectHandle(pFilteredBuffer->m_resolveFBO);
} else {
// glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_FBO);
readBuffer = ObjectHandle(pFilteredBuffer->m_FBO);
filter = textureParameters::FILTER_NEAREST;
}
} else {
readBuffer = ObjectHandle(pFilteredBuffer->m_FBO);
// glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_FBO);
}
// glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
GraphicsDrawer::BlitOrCopyRectParams blitParams;
blitParams.srcX0 = srcCoord[0];
blitParams.srcY0 = srcCoord[1];
@ -1000,14 +990,10 @@ void FrameBufferList::renderBuffer(u32 _address)
if (pFilteredBuffer->m_pTexture->frameBufferTexture == CachedTexture::fbMultiSample) {
pFilteredBuffer->resolveMultisampledTexture();
readBuffer = ObjectHandle(pFilteredBuffer->m_resolveFBO);
// glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_resolveFBO);
} else {
// glBindFramebuffer(GL_READ_FRAMEBUFFER, pFilteredBuffer->m_FBO);
readBuffer = ObjectHandle(pFilteredBuffer->m_FBO);
}
// glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
pBufferTexture = pFilteredBuffer->m_pTexture;
blitParams.srcX0 = 0;
@ -1129,8 +1115,6 @@ bool FrameBuffer_CopyDepthBufferChunk(u32 address)
void FrameBuffer_CopyFromRDRAM(u32 _address, bool _bCFB)
{
// TODO fix me
return;
RDRAMtoColorBuffer::get().copyFromRDRAM(_address, _bCFB);
}

View File

@ -301,16 +301,21 @@ public:
return !_glinfo.isGLES2;
}
BlitFramebuffersImpl(CachedBindFramebuffer * _bind)
: m_bind(_bind) {}
BlitFramebuffersImpl(CachedBindFramebuffer * _bind, Renderer _renderer)
: m_bind(_bind)
, m_renderer(_renderer) {
}
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);
const s32 adrenoCoordFix = (m_renderer == Renderer::Adreno) ? 1 : 0;
glBlitFramebuffer(
_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)
);
return !Utils::isGLError();
@ -318,6 +323,7 @@ public:
private:
CachedBindFramebuffer * m_bind;
Renderer m_renderer;
};
class DummyBlitFramebuffers: public BlitFramebuffers
@ -501,7 +507,7 @@ AddFramebufferRenderTarget * BufferManipulationObjectFactory::getAddFramebufferR
BlitFramebuffers * BufferManipulationObjectFactory::getBlitFramebuffers() const
{
if (BlitFramebuffersImpl::Check(m_glInfo))
return new BlitFramebuffersImpl(m_cachedFunctions.getCachedBindFramebuffer());
return new BlitFramebuffersImpl(m_cachedFunctions.getCachedBindFramebuffer(), m_glInfo.renderer);
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 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) {
imageTextures = false;
msaa = false;

View File

@ -3,15 +3,21 @@
namespace opengl {
struct GLInfo {
GLint majorVersion = 0;
GLint minorVersion = 0;
bool isGLES2 = false;
bool isGLESX = false;
bool imageTextures = false;
bool shaderStorage = false;
bool msaa = false;
enum class Renderer {
Adreno,
Other
};
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();
};
}