mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-02 09:03:37 +00:00
Enable Framebuffer Emulation on the Raspberry Pi
renderbuffer code was written by gonetz, not me
This commit is contained in:
parent
cb54444b41
commit
1cbbea8183
|
@ -64,6 +64,7 @@ if(EXISTS "/opt/vc/include/bcm_host.h")
|
|||
set(GLES2 ON)
|
||||
add_definitions(
|
||||
-DVC
|
||||
-DUSE_DEPTH_RENDERBUFFER
|
||||
)
|
||||
include_directories(
|
||||
"/opt/vc/include"
|
||||
|
|
|
@ -43,11 +43,7 @@ void Config::resetToDefaults()
|
|||
generalEmulation.polygonOffsetUnits = 0.0f;
|
||||
#endif
|
||||
|
||||
#ifdef VC
|
||||
frameBufferEmulation.enable = 0;
|
||||
#else
|
||||
frameBufferEmulation.enable = 1;
|
||||
#endif
|
||||
frameBufferEmulation.copyDepthToRDRAM = cdDisable;
|
||||
frameBufferEmulation.copyFromRDRAM = 0;
|
||||
frameBufferEmulation.copyAuxToRDRAM = 0;
|
||||
|
|
|
@ -19,6 +19,7 @@ const GLuint depthImageUnit = 2;
|
|||
|
||||
DepthBuffer::DepthBuffer() : m_address(0), m_width(0), m_uly(0), m_lry(0),
|
||||
m_depthImageFBO(0), m_pDepthImageTexture(nullptr), m_pDepthBufferTexture(nullptr),
|
||||
m_depthRenderbuffer(0), m_depthRenderbufferWidth(0),
|
||||
m_cleared(false), m_pResolveDepthBufferTexture(nullptr), m_resolved(false),
|
||||
m_pDepthBufferCopyTexture(nullptr), m_copied(false)
|
||||
{
|
||||
|
@ -30,12 +31,14 @@ DepthBuffer::DepthBuffer() : m_address(0), m_width(0), m_uly(0), m_lry(0),
|
|||
DepthBuffer::DepthBuffer(DepthBuffer && _other) :
|
||||
m_address(_other.m_address), m_width(_other.m_width), m_uly(_other.m_uly), m_lry(_other.m_lry),
|
||||
m_depthImageFBO(_other.m_depthImageFBO), m_pDepthImageTexture(_other.m_pDepthImageTexture), m_pDepthBufferTexture(_other.m_pDepthBufferTexture),
|
||||
m_depthRenderbuffer(_other.m_depthRenderbuffer), m_depthRenderbufferWidth(_other.m_depthRenderbufferWidth),
|
||||
m_cleared(_other.m_cleared), m_pResolveDepthBufferTexture(_other.m_pResolveDepthBufferTexture), m_resolved(_other.m_resolved),
|
||||
m_pDepthBufferCopyTexture(_other.m_pDepthBufferCopyTexture), m_copied(m_copied)
|
||||
{
|
||||
_other.m_depthImageFBO = 0;
|
||||
_other.m_pDepthImageTexture = nullptr;
|
||||
_other.m_pDepthBufferTexture = nullptr;
|
||||
_other.m_depthRenderbuffer = 0;
|
||||
_other.m_pResolveDepthBufferTexture = nullptr;
|
||||
_other.m_resolved = false;
|
||||
_other.m_pDepthBufferCopyTexture = nullptr;
|
||||
|
@ -50,6 +53,8 @@ DepthBuffer::~DepthBuffer()
|
|||
textureCache().removeFrameBufferTexture(m_pDepthImageTexture);
|
||||
if (m_pDepthBufferTexture != nullptr)
|
||||
textureCache().removeFrameBufferTexture(m_pDepthBufferTexture);
|
||||
if (m_depthRenderbuffer != 0)
|
||||
glDeleteRenderbuffers(1, &m_depthRenderbuffer);
|
||||
if (m_pResolveDepthBufferTexture != nullptr)
|
||||
textureCache().removeFrameBufferTexture(m_pResolveDepthBufferTexture);
|
||||
if (m_copyFBO != 0)
|
||||
|
@ -157,24 +162,55 @@ void DepthBuffer::_initDepthBufferTexture(FrameBuffer * _pBuffer, CachedTexture
|
|||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
}
|
||||
|
||||
void DepthBuffer::_initDepthBufferRenderbuffer(FrameBuffer * _pBuffer)
|
||||
{
|
||||
if (m_depthRenderbuffer != 0)
|
||||
return;
|
||||
u32 height;
|
||||
if (_pBuffer != NULL) {
|
||||
m_depthRenderbufferWidth = (u32)(_pBuffer->m_pTexture->width);
|
||||
height = (u32)(_pBuffer->m_pTexture->height);
|
||||
} else {
|
||||
if (config.frameBufferEmulation.nativeResFactor == 0) {
|
||||
m_depthRenderbufferWidth = video().getWidth();
|
||||
height = video().getHeight();
|
||||
} else {
|
||||
m_depthRenderbufferWidth = VI.width * config.frameBufferEmulation.nativeResFactor;
|
||||
height = VI.height * config.frameBufferEmulation.nativeResFactor;
|
||||
}
|
||||
}
|
||||
|
||||
glGenRenderbuffers(1, &m_depthRenderbuffer);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, m_depthRenderbuffer);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, fboFormats.depthInternalFormat, m_depthRenderbufferWidth, height);
|
||||
}
|
||||
|
||||
void DepthBuffer::setDepthAttachment(GLenum _target)
|
||||
{
|
||||
#ifndef USE_DEPTH_RENDERBUFFER
|
||||
#ifdef GL_MULTISAMPLING_SUPPORT
|
||||
if (config.video.multisampling != 0)
|
||||
glFramebufferTexture2D(_target, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, m_pDepthBufferTexture->glName, 0);
|
||||
else
|
||||
#endif
|
||||
glFramebufferTexture2D(_target, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_pDepthBufferTexture->glName, 0);
|
||||
#else
|
||||
glFramebufferRenderbuffer(_target, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthRenderbuffer);
|
||||
#endif
|
||||
m_copied = false;
|
||||
m_resolved = false;
|
||||
}
|
||||
|
||||
void DepthBuffer::initDepthBufferTexture(FrameBuffer * _pBuffer)
|
||||
{
|
||||
#ifndef USE_DEPTH_RENDERBUFFER
|
||||
if (m_pDepthBufferTexture == nullptr) {
|
||||
m_pDepthBufferTexture = textureCache().addFrameBufferTexture();
|
||||
_initDepthBufferTexture(_pBuffer, m_pDepthBufferTexture, config.video.multisampling != 0);
|
||||
}
|
||||
#else
|
||||
_initDepthBufferRenderbuffer(_pBuffer);
|
||||
#endif
|
||||
|
||||
#ifdef GL_MULTISAMPLING_SUPPORT
|
||||
if (config.video.multisampling != 0 && m_pResolveDepthBufferTexture == nullptr) {
|
||||
|
|
|
@ -25,6 +25,8 @@ struct DepthBuffer
|
|||
GLuint m_depthImageFBO;
|
||||
CachedTexture *m_pDepthImageTexture;
|
||||
CachedTexture *m_pDepthBufferTexture;
|
||||
GLuint m_depthRenderbuffer;
|
||||
u32 m_depthRenderbufferWidth;
|
||||
bool m_cleared;
|
||||
// multisampling
|
||||
CachedTexture *m_pResolveDepthBufferTexture;
|
||||
|
@ -36,6 +38,7 @@ struct DepthBuffer
|
|||
|
||||
private:
|
||||
void _initDepthBufferTexture(FrameBuffer * _pBuffer, CachedTexture *_pTexture, bool _multisample);
|
||||
void _initDepthBufferRenderbuffer(FrameBuffer * _pBuffer);
|
||||
void _DepthBufferTexture(FrameBuffer * _pBuffer);
|
||||
};
|
||||
|
||||
|
|
|
@ -707,16 +707,24 @@ void FrameBufferList::attachDepthBuffer()
|
|||
{
|
||||
if (m_pCurrent == nullptr)
|
||||
return;
|
||||
#ifdef VC
|
||||
const GLenum discards[] = {GL_DEPTH_ATTACHMENT};
|
||||
glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards);
|
||||
#endif
|
||||
|
||||
DepthBuffer * pDepthBuffer = depthBufferList().getCurrent();
|
||||
if (m_pCurrent->m_FBO > 0 && pDepthBuffer != nullptr) {
|
||||
pDepthBuffer->initDepthImageTexture(m_pCurrent);
|
||||
pDepthBuffer->initDepthBufferTexture(m_pCurrent);
|
||||
#ifndef USE_DEPTH_RENDERBUFFER
|
||||
#ifdef GLES2
|
||||
if (pDepthBuffer->m_pDepthBufferTexture->realWidth == m_pCurrent->m_pTexture->realWidth) {
|
||||
#else
|
||||
if (pDepthBuffer->m_pDepthBufferTexture->realWidth >= m_pCurrent->m_pTexture->realWidth) {
|
||||
#endif
|
||||
#endif // GLES2
|
||||
#else
|
||||
if (pDepthBuffer->m_depthRenderbufferWidth == m_pCurrent->m_pTexture->realWidth) {
|
||||
#endif // USE_DEPTH_RENDERBUFFER
|
||||
m_pCurrent->m_pDepthBuffer = pDepthBuffer;
|
||||
pDepthBuffer->setDepthAttachment(GL_DRAW_FRAMEBUFFER);
|
||||
if (video().getRender().isImageTexturesSupported() && config.frameBufferEmulation.N64DepthCompare != 0)
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <GLideN64_libretro.h>
|
||||
#elif GLES2
|
||||
#include <GLES2/gl2.h>
|
||||
#include <GLES2/gl2ext.h>
|
||||
#define GL_DRAW_FRAMEBUFFER GL_FRAMEBUFFER
|
||||
#define GL_READ_FRAMEBUFFER GL_FRAMEBUFFER
|
||||
#define NO_BLIT_BUFFER_COPY
|
||||
|
|
Loading…
Reference in New Issue
Block a user