half-proper screen clear.
still missing bitmap mode, but atleast you can play NSMB without being in the dark.
This commit is contained in:
parent
8c2b4b4813
commit
4a776f5d5b
|
@ -48,6 +48,7 @@ PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
|
||||||
PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
|
PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
|
||||||
PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
|
PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
|
||||||
PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
|
PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
|
||||||
|
PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray;
|
||||||
PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
|
PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
|
||||||
PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer;
|
PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer;
|
||||||
|
|
||||||
|
@ -64,6 +65,8 @@ PFNGLGETPROGRAMIVPROC glGetProgramiv;
|
||||||
PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;
|
PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;
|
||||||
PFNGLDELETESHADERPROC glDeleteShader;
|
PFNGLDELETESHADERPROC glDeleteShader;
|
||||||
PFNGLDELETEPROGRAMPROC glDeleteProgram;
|
PFNGLDELETEPROGRAMPROC glDeleteProgram;
|
||||||
|
PFNGLUNIFORM1UIPROC glUniform1ui;
|
||||||
|
PFNGLUNIFORM4UIPROC glUniform4ui;
|
||||||
|
|
||||||
PFNGLACTIVETEXTUREPROC glActiveTexture;
|
PFNGLACTIVETEXTUREPROC glActiveTexture;
|
||||||
PFNGLBINDIMAGETEXTUREPROC glBindImageTexture;
|
PFNGLBINDIMAGETEXTUREPROC glBindImageTexture;
|
||||||
|
@ -71,7 +74,33 @@ PFNGLBINDIMAGETEXTUREPROC glBindImageTexture;
|
||||||
PFNGLGETSTRINGIPROC glGetStringi;
|
PFNGLGETSTRINGIPROC glGetStringi;
|
||||||
|
|
||||||
|
|
||||||
const char* kShaderHeader = "#version 420";
|
#define kShaderHeader "#version 430"
|
||||||
|
|
||||||
|
|
||||||
|
const char* kClearVS = kShaderHeader R"(
|
||||||
|
|
||||||
|
layout(location=0) in vec2 vPosition;
|
||||||
|
|
||||||
|
layout(location=1) uniform uint uDepth;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
float fdepth = (float(uDepth) / 8388608.0) - 1.0;
|
||||||
|
gl_Position = vec4(vPosition, fdepth, 1.0);
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
const char* kClearFS = kShaderHeader R"(
|
||||||
|
|
||||||
|
layout(location=0) uniform uvec4 uColor;
|
||||||
|
|
||||||
|
out vec4 oColor;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
oColor = vec4(uColor).bgra / 255.0;
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
|
||||||
const char* kRenderVSCommon = R"(
|
const char* kRenderVSCommon = R"(
|
||||||
|
@ -423,6 +452,8 @@ enum
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
GLuint ClearShaderPlain[3];
|
||||||
|
|
||||||
GLuint RenderShader[16][3];
|
GLuint RenderShader[16][3];
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -436,6 +467,8 @@ typedef struct
|
||||||
|
|
||||||
RendererPolygon PolygonList[2048];
|
RendererPolygon PolygonList[2048];
|
||||||
|
|
||||||
|
GLuint ClearVertexBufferID, ClearVertexArrayID;
|
||||||
|
|
||||||
// vertex buffer
|
// vertex buffer
|
||||||
// * XYZW: 4x16bit
|
// * XYZW: 4x16bit
|
||||||
// * RGBA: 4x8bit
|
// * RGBA: 4x8bit
|
||||||
|
@ -459,7 +492,7 @@ u32 NumTriangles;
|
||||||
GLuint TexMemID;
|
GLuint TexMemID;
|
||||||
GLuint TexPalMemID;
|
GLuint TexPalMemID;
|
||||||
|
|
||||||
GLuint FramebufferTex[2];
|
GLuint FramebufferTex[3];
|
||||||
GLuint FramebufferID, PixelbufferID;
|
GLuint FramebufferID, PixelbufferID;
|
||||||
u8 Framebuffer[256*192*4];
|
u8 Framebuffer[256*192*4];
|
||||||
u8 CurLine[256*4];
|
u8 CurLine[256*4];
|
||||||
|
@ -489,6 +522,7 @@ bool InitGLExtensions()
|
||||||
LOADPROC(GLDELETEVERTEXARRAYS, glDeleteVertexArrays);
|
LOADPROC(GLDELETEVERTEXARRAYS, glDeleteVertexArrays);
|
||||||
LOADPROC(GLBINDVERTEXARRAY, glBindVertexArray);
|
LOADPROC(GLBINDVERTEXARRAY, glBindVertexArray);
|
||||||
LOADPROC(GLENABLEVERTEXATTRIBARRAY, glEnableVertexAttribArray);
|
LOADPROC(GLENABLEVERTEXATTRIBARRAY, glEnableVertexAttribArray);
|
||||||
|
LOADPROC(GLDISABLEVERTEXATTRIBARRAY, glDisableVertexAttribArray);
|
||||||
LOADPROC(GLVERTEXATTRIBPOINTER, glVertexAttribPointer);
|
LOADPROC(GLVERTEXATTRIBPOINTER, glVertexAttribPointer);
|
||||||
LOADPROC(GLVERTEXATTRIBIPOINTER, glVertexAttribIPointer);
|
LOADPROC(GLVERTEXATTRIBIPOINTER, glVertexAttribIPointer);
|
||||||
|
|
||||||
|
@ -505,6 +539,8 @@ bool InitGLExtensions()
|
||||||
LOADPROC(GLGETPROGRAMINFOLOG, glGetProgramInfoLog);
|
LOADPROC(GLGETPROGRAMINFOLOG, glGetProgramInfoLog);
|
||||||
LOADPROC(GLDELETESHADER, glDeleteShader);
|
LOADPROC(GLDELETESHADER, glDeleteShader);
|
||||||
LOADPROC(GLDELETEPROGRAM, glDeleteProgram);
|
LOADPROC(GLDELETEPROGRAM, glDeleteProgram);
|
||||||
|
LOADPROC(GLUNIFORM1UI, glUniform1ui);
|
||||||
|
LOADPROC(GLUNIFORM4UI, glUniform4ui);
|
||||||
|
|
||||||
LOADPROC(GLACTIVETEXTURE, glActiveTexture);
|
LOADPROC(GLACTIVETEXTURE, glActiveTexture);
|
||||||
LOADPROC(GLBINDIMAGETEXTURE, glBindImageTexture);
|
LOADPROC(GLBINDIMAGETEXTURE, glBindImageTexture);
|
||||||
|
@ -651,6 +687,8 @@ bool Init()
|
||||||
printf("- %s\n", ext);
|
printf("- %s\n", ext);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
|
||||||
// TODO: make configurable (hires, etc)
|
// TODO: make configurable (hires, etc)
|
||||||
glViewport(0, 0, 256, 192);
|
glViewport(0, 0, 256, 192);
|
||||||
|
@ -658,8 +696,9 @@ bool Init()
|
||||||
glClearDepth(1.0);
|
glClearDepth(1.0);
|
||||||
|
|
||||||
|
|
||||||
//if (!BuildShaderProgram(kRenderVS, kRenderFS, RenderShader, "RenderShader"))
|
if (!BuildShaderProgram(kClearVS, kClearFS, ClearShaderPlain, "ClearShader"))
|
||||||
// return false;
|
return false;
|
||||||
|
|
||||||
if (!BuildRenderShader(0,
|
if (!BuildRenderShader(0,
|
||||||
kRenderVS_Z, kRenderFS_ZO)) return false;
|
kRenderVS_Z, kRenderFS_ZO)) return false;
|
||||||
if (!BuildRenderShader(RenderFlag_WBuffer,
|
if (!BuildRenderShader(RenderFlag_WBuffer,
|
||||||
|
@ -670,6 +709,27 @@ bool Init()
|
||||||
kRenderVS_W, kRenderFS_WT)) return false;
|
kRenderVS_W, kRenderFS_WT)) return false;
|
||||||
|
|
||||||
|
|
||||||
|
float clearvtx[6*2] =
|
||||||
|
{
|
||||||
|
-1.0, -1.0,
|
||||||
|
1.0, 1.0,
|
||||||
|
-1.0, 1.0,
|
||||||
|
|
||||||
|
-1.0, -1.0,
|
||||||
|
1.0, -1.0,
|
||||||
|
1.0, 1.0
|
||||||
|
};
|
||||||
|
|
||||||
|
glGenBuffers(1, &ClearVertexBufferID);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, ClearVertexBufferID);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(clearvtx), clearvtx, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glGenVertexArrays(1, &ClearVertexArrayID);
|
||||||
|
glBindVertexArray(ClearVertexArrayID);
|
||||||
|
glEnableVertexAttribArray(0); // position
|
||||||
|
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)(0));
|
||||||
|
|
||||||
|
|
||||||
glGenBuffers(1, &VertexBufferID);
|
glGenBuffers(1, &VertexBufferID);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, VertexBufferID);
|
glBindBuffer(GL_ARRAY_BUFFER, VertexBufferID);
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(VertexBuffer), NULL, GL_DYNAMIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, sizeof(VertexBuffer), NULL, GL_DYNAMIC_DRAW);
|
||||||
|
@ -707,6 +767,15 @@ bool Init()
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 256, 192, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); // welp
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 256, 192, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); // welp
|
||||||
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, FramebufferTex[1], 0);
|
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, FramebufferTex[1], 0);
|
||||||
|
|
||||||
|
glGenTextures(1, &FramebufferTex[2]);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, FramebufferTex[2]);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_STENCIL_INDEX, 256, 192, 0, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, NULL);
|
||||||
|
glFramebufferTexture(GL_FRAMEBUFFER, GL_STENCIL_INDEX, FramebufferTex[2], 0);
|
||||||
|
|
||||||
glGenBuffers(1, &PixelbufferID);
|
glGenBuffers(1, &PixelbufferID);
|
||||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, PixelbufferID);
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, PixelbufferID);
|
||||||
//glBufferData(GL_PIXEL_PACK_BUFFER, 256*48*4, NULL, GL_DYNAMIC_READ);
|
//glBufferData(GL_PIXEL_PACK_BUFFER, 256*48*4, NULL, GL_DYNAMIC_READ);
|
||||||
|
@ -855,11 +924,6 @@ void VCount144()
|
||||||
|
|
||||||
void RenderFrame()
|
void RenderFrame()
|
||||||
{
|
{
|
||||||
// TODO: proper clear color!!
|
|
||||||
glClearColor(0, 0, 0, 31.0/255.0);
|
|
||||||
glClearDepth(1.0);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
||||||
|
|
||||||
// SUCKY!!!!!!!!!!!!!!!!!!
|
// SUCKY!!!!!!!!!!!!!!!!!!
|
||||||
// TODO: detect when VRAM blocks are modified!
|
// TODO: detect when VRAM blocks are modified!
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
@ -892,7 +956,30 @@ void RenderFrame()
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, i*8, 1024, 8, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, vram);
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, i*8, 1024, 8, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, vram);
|
||||||
}
|
}
|
||||||
|
|
||||||
//glActiveTexture(GL_TEXTURE0);
|
// clear buffers
|
||||||
|
// TODO: clear bitmap
|
||||||
|
{
|
||||||
|
glUseProgram(ClearShaderPlain[2]);
|
||||||
|
glDepthFunc(GL_ALWAYS);
|
||||||
|
glDepthMask(GL_TRUE);
|
||||||
|
|
||||||
|
u32 r = RenderClearAttr1 & 0x1F;
|
||||||
|
u32 g = (RenderClearAttr1 >> 5) & 0x1F;
|
||||||
|
u32 b = (RenderClearAttr1 >> 10) & 0x1F;
|
||||||
|
u32 a = (RenderClearAttr1 >> 16) & 0x1F;
|
||||||
|
u32 z = ((RenderClearAttr2 & 0x7FFF) * 0x200) + 0x1FF;
|
||||||
|
|
||||||
|
if (r) r = r*2 + 1;
|
||||||
|
if (g) g = g*2 + 1;
|
||||||
|
if (b) b = b*2 + 1;
|
||||||
|
|
||||||
|
glUniform4ui(0, r, g, b, a);
|
||||||
|
glUniform1ui(1, z);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, ClearVertexBufferID);
|
||||||
|
glBindVertexArray(ClearVertexArrayID);
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 2*3);
|
||||||
|
}
|
||||||
|
|
||||||
if (RenderNumPolygons)
|
if (RenderNumPolygons)
|
||||||
{
|
{
|
||||||
|
@ -907,16 +994,17 @@ void RenderFrame()
|
||||||
SetupPolygon(&PolygonList[npolys++], RenderPolygonRAM[i]);
|
SetupPolygon(&PolygonList[npolys++], RenderPolygonRAM[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
UseRenderShader(flags);
|
|
||||||
|
|
||||||
// zorp
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
|
||||||
glDepthFunc(GL_LESS);
|
|
||||||
|
|
||||||
BuildPolygons(&PolygonList[0], npolys);
|
BuildPolygons(&PolygonList[0], npolys);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, VertexBufferID);
|
glBindBuffer(GL_ARRAY_BUFFER, VertexBufferID);
|
||||||
glBufferSubData(GL_ARRAY_BUFFER, 0, NumVertices*7*4, VertexBuffer);
|
glBufferSubData(GL_ARRAY_BUFFER, 0, NumVertices*7*4, VertexBuffer);
|
||||||
|
|
||||||
|
// pass 1: opaque pixels
|
||||||
|
|
||||||
|
UseRenderShader(flags);
|
||||||
|
|
||||||
|
// zorp
|
||||||
|
glDepthFunc(GL_LESS);
|
||||||
|
|
||||||
glBindVertexArray(VertexArrayID);
|
glBindVertexArray(VertexArrayID);
|
||||||
glDrawElements(GL_TRIANGLES, NumTriangles*3, GL_UNSIGNED_SHORT, IndexBuffer);
|
glDrawElements(GL_TRIANGLES, NumTriangles*3, GL_UNSIGNED_SHORT, IndexBuffer);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue