mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-07 03:13:49 +00:00
Rewrite depth texture clear.
This commit is contained in:
parent
314b9098f4
commit
344df93374
|
@ -1,12 +1,16 @@
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include "OpenGL.h"
|
#include "OpenGL.h"
|
||||||
|
#include "Combiner.h"
|
||||||
#include "FrameBuffer.h"
|
#include "FrameBuffer.h"
|
||||||
#include "DepthBuffer.h"
|
#include "DepthBuffer.h"
|
||||||
#include "VI.h"
|
#include "VI.h"
|
||||||
#include "Debug.h"
|
#include "Debug.h"
|
||||||
|
|
||||||
DepthBufferInfo depthBuffer;
|
DepthBufferInfo depthBuffer;
|
||||||
|
const GLuint ZlutImageUnit = 0;
|
||||||
|
const GLuint TlutImageUnit = 1;
|
||||||
|
const GLuint depthImageUnit = 2;
|
||||||
|
|
||||||
void DepthBuffer_Init()
|
void DepthBuffer_Init()
|
||||||
{
|
{
|
||||||
|
@ -213,3 +217,13 @@ DepthBuffer *DepthBuffer_FindBuffer( u32 address )
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
void DepthBuffer_ClearBuffer() {
|
||||||
|
DepthBuffer *current = depthBuffer.top;
|
||||||
|
if (current == NULL || current->fbo == 0)
|
||||||
|
return;
|
||||||
|
float color[4] = {1.0f, 1.0f, 0.0f, 0.0f};
|
||||||
|
glBindImageTexture(depthImageUnit, 0, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
|
||||||
|
ogl_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current->fbo);
|
||||||
|
OGL_DrawRect(0,0,VI.width, VI.height, color);
|
||||||
|
ogl_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frameBuffer.top->fbo);
|
||||||
|
}
|
||||||
|
|
|
@ -22,10 +22,15 @@ struct DepthBufferInfo
|
||||||
|
|
||||||
extern DepthBufferInfo depthBuffer;
|
extern DepthBufferInfo depthBuffer;
|
||||||
|
|
||||||
|
extern const GLuint ZlutImageUnit;
|
||||||
|
extern const GLuint TlutImageUnit;
|
||||||
|
extern const GLuint depthImageUnit;
|
||||||
|
|
||||||
void DepthBuffer_Init();
|
void DepthBuffer_Init();
|
||||||
void DepthBuffer_Destroy();
|
void DepthBuffer_Destroy();
|
||||||
void DepthBuffer_SetBuffer( u32 address );
|
void DepthBuffer_SetBuffer( u32 address );
|
||||||
void DepthBuffer_RemoveBuffer( u32 address );
|
void DepthBuffer_RemoveBuffer( u32 address );
|
||||||
|
void DepthBuffer_ClearBuffer();
|
||||||
//DepthBuffer *DepthBuffer_FindBuffer( u32 address );
|
//DepthBuffer *DepthBuffer_FindBuffer( u32 address );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -375,8 +375,7 @@ void _initDepthTexture()
|
||||||
ogl_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
ogl_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||||
ogl_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frameBuffer.top->fbo);
|
ogl_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frameBuffer.top->fbo);
|
||||||
frameBuffer.top->pDepthBuffer = depthBuffer.top;
|
frameBuffer.top->pDepthBuffer = depthBuffer.top;
|
||||||
void GLSL_ClearDepthBuffer();
|
DepthBuffer_ClearBuffer();
|
||||||
GLSL_ClearDepthBuffer();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FrameBuffer_AttachDepthBuffer()
|
void FrameBuffer_AttachDepthBuffer()
|
||||||
|
|
|
@ -23,10 +23,6 @@ static GLuint g_draw_shadow_map_program;
|
||||||
GLuint g_tlut_tex = 0;
|
GLuint g_tlut_tex = 0;
|
||||||
static u32 g_paletteCRC256 = 0;
|
static u32 g_paletteCRC256 = 0;
|
||||||
|
|
||||||
static const GLuint ZlutImageUnit = 0;
|
|
||||||
static const GLuint TlutImageUnit = 1;
|
|
||||||
static const GLuint depthImageUnit = 2;
|
|
||||||
|
|
||||||
static
|
static
|
||||||
void display_warning(const char *text, ...)
|
void display_warning(const char *text, ...)
|
||||||
{
|
{
|
||||||
|
@ -562,8 +558,7 @@ void GLSLCombiner::UpdateFBInfo() {
|
||||||
glUniform1i(fbFixedAlpha_location, nFbFixedAlpha);
|
glUniform1i(fbFixedAlpha_location, nFbFixedAlpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
void unbindImageTextures() {
|
||||||
void _unbindImageTextures() {
|
|
||||||
glBindImageTexture(TlutImageUnit, 0, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R16UI);
|
glBindImageTexture(TlutImageUnit, 0, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R16UI);
|
||||||
glBindImageTexture(ZlutImageUnit, 0, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R16UI);
|
glBindImageTexture(ZlutImageUnit, 0, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R16UI);
|
||||||
glBindImageTexture(depthImageUnit, 0, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
|
glBindImageTexture(depthImageUnit, 0, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
|
||||||
|
@ -573,7 +568,7 @@ void GLSLCombiner::UpdateDepthInfo() {
|
||||||
if (!OGL.bImageTexture)
|
if (!OGL.bImageTexture)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_unbindImageTextures();
|
unbindImageTextures();
|
||||||
|
|
||||||
if (frameBuffer.top == NULL || frameBuffer.top->pDepthBuffer == NULL)
|
if (frameBuffer.top == NULL || frameBuffer.top->pDepthBuffer == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -600,38 +595,6 @@ void GLSLCombiner::UpdateDepthInfo() {
|
||||||
glBindImageTexture(depthImageUnit, texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
|
glBindImageTexture(depthImageUnit, texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLSL_ClearDepthBuffer() {
|
|
||||||
if (!OGL.bImageTexture)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (frameBuffer.top == NULL || frameBuffer.top->pDepthBuffer == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_unbindImageTextures();
|
|
||||||
CachedTexture * pDepthTexture = frameBuffer.top->pDepthBuffer->depth_texture;
|
|
||||||
const u32 numTexels = pDepthTexture->width*pDepthTexture->height*4;
|
|
||||||
|
|
||||||
char * pData = (char*)malloc(numTexels * sizeof(float));
|
|
||||||
f32 * pDepth = (f32*)pData;
|
|
||||||
for (int i = 0; i < numTexels; i+=4) {
|
|
||||||
pDepth[i] = 1.0f;
|
|
||||||
pDepth[i+1] = 1.0f;
|
|
||||||
pDepth[i+2] = 0.0f;
|
|
||||||
pDepth[i+3] = 0.0f;
|
|
||||||
}
|
|
||||||
glBindTexture(GL_TEXTURE_2D, pDepthTexture->glName);
|
|
||||||
|
|
||||||
|
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
|
|
||||||
pDepthTexture->width, pDepthTexture->height,
|
|
||||||
GL_RGBA, GL_FLOAT, pData
|
|
||||||
);
|
|
||||||
free(pData);
|
|
||||||
|
|
||||||
gSP.changed |= CHANGED_TEXTURE;
|
|
||||||
gDP.changed |= CHANGED_COMBINE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void GLSLCombiner::UpdateAlphaTestInfo() {
|
void GLSLCombiner::UpdateAlphaTestInfo() {
|
||||||
int at_enabled_location = glGetUniformLocation(m_program, "alphaTestEnabled");
|
int at_enabled_location = glGetUniformLocation(m_program, "alphaTestEnabled");
|
||||||
int at_value_location = glGetUniformLocation(m_program, "alphaTestValue");
|
int at_value_location = glGetUniformLocation(m_program, "alphaTestValue");
|
||||||
|
@ -665,8 +628,7 @@ void GLSL_RenderDepth() {
|
||||||
#else
|
#else
|
||||||
if (frameBuffer.top == NULL || frameBuffer.top->pDepthBuffer == NULL)
|
if (frameBuffer.top == NULL || frameBuffer.top->pDepthBuffer == NULL)
|
||||||
return;
|
return;
|
||||||
_unbindImageTextures();
|
unbindImageTextures();
|
||||||
return;
|
|
||||||
glPushAttrib( GL_ENABLE_BIT | GL_VIEWPORT_BIT );
|
glPushAttrib( GL_ENABLE_BIT | GL_VIEWPORT_BIT );
|
||||||
|
|
||||||
glActiveTexture( GL_TEXTURE0 );
|
glActiveTexture( GL_TEXTURE0 );
|
||||||
|
@ -732,7 +694,7 @@ void GLS_SetShadowMapCombiner() {
|
||||||
if (!OGL.bImageTexture)
|
if (!OGL.bImageTexture)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_unbindImageTextures();
|
unbindImageTextures();
|
||||||
|
|
||||||
if (g_paletteCRC256 != gDP.paletteCRC256) {
|
if (g_paletteCRC256 != gDP.paletteCRC256) {
|
||||||
g_paletteCRC256 = gDP.paletteCRC256;
|
g_paletteCRC256 = gDP.paletteCRC256;
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "Textures.h"
|
#include "Textures.h"
|
||||||
#include "Combiner.h"
|
#include "Combiner.h"
|
||||||
#include "FrameBuffer.h"
|
#include "FrameBuffer.h"
|
||||||
|
#include "DepthBuffer.h"
|
||||||
#include "VI.h"
|
#include "VI.h"
|
||||||
|
|
||||||
GLInfo OGL;
|
GLInfo OGL;
|
||||||
|
@ -1037,8 +1038,7 @@ void OGL_ClearDepthBuffer()
|
||||||
if (OGL.frameBufferTextures && frameBuffer.top == NULL)
|
if (OGL.frameBufferTextures && frameBuffer.top == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
void GLSL_ClearDepthBuffer();
|
DepthBuffer_ClearBuffer();
|
||||||
GLSL_ClearDepthBuffer();
|
|
||||||
|
|
||||||
glDisable( GL_SCISSOR_TEST );
|
glDisable( GL_SCISSOR_TEST );
|
||||||
|
|
||||||
|
|
2
RSP.cpp
2
RSP.cpp
|
@ -211,6 +211,8 @@ void RSP_ProcessDList()
|
||||||
GBI.cmd[RSP.cmd]( w0, w1 );
|
GBI.cmd[RSP.cmd]( w0, w1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void unbindImageTextures();
|
||||||
|
unbindImageTextures();
|
||||||
if (g_bCopyToRDRAM)
|
if (g_bCopyToRDRAM)
|
||||||
FrameBuffer_CopyToRDRAM( gDP.colorImage.address, false );
|
FrameBuffer_CopyToRDRAM( gDP.colorImage.address, false );
|
||||||
if (g_bCopyDepthToRDRAM)
|
if (g_bCopyDepthToRDRAM)
|
||||||
|
|
6
gDP.h
6
gDP.h
|
@ -166,7 +166,7 @@ struct gDPInfo
|
||||||
|
|
||||||
gDPTile tiles[8], *loadTile;
|
gDPTile tiles[8], *loadTile;
|
||||||
|
|
||||||
struct
|
struct Color
|
||||||
{
|
{
|
||||||
f32 r, g, b, a;
|
f32 r, g, b, a;
|
||||||
} fogColor, blendColor, envColor;
|
} fogColor, blendColor, envColor;
|
||||||
|
@ -177,9 +177,9 @@ struct gDPInfo
|
||||||
u32 color;
|
u32 color;
|
||||||
} fillColor;
|
} fillColor;
|
||||||
|
|
||||||
struct
|
struct PrimColor : public Color
|
||||||
{
|
{
|
||||||
f32 m, l, r, g, b, a;
|
f32 m, l;
|
||||||
} primColor;
|
} primColor;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
|
|
Loading…
Reference in New Issue
Block a user