mirror of https://github.com/mgba-emu/mgba.git
GBA Video: Clean up GL uniforms
This commit is contained in:
parent
3e8bb42e9f
commit
4e4e461175
|
@ -82,6 +82,46 @@ enum {
|
|||
GBA_GL_TEX_MAX
|
||||
};
|
||||
|
||||
enum {
|
||||
GBA_GL_VS_LOC = 0,
|
||||
GBA_GL_VS_MAXPOS,
|
||||
|
||||
GBA_GL_BG_VRAM = 2,
|
||||
GBA_GL_BG_PALETTE,
|
||||
GBA_GL_BG_SCREENBASE,
|
||||
GBA_GL_BG_CHARBASE,
|
||||
GBA_GL_BG_SIZE,
|
||||
GBA_GL_BG_OFFSET,
|
||||
GBA_GL_BG_INFLAGS,
|
||||
GBA_GL_BG_TRANSFORM,
|
||||
|
||||
GBA_GL_OBJ_VRAM = 2,
|
||||
GBA_GL_OBJ_PALETTE,
|
||||
GBA_GL_OBJ_CHARBASE,
|
||||
GBA_GL_OBJ_STRIDE,
|
||||
GBA_GL_OBJ_LOCALPALETTE,
|
||||
GBA_GL_OBJ_INFLAGS,
|
||||
GBA_GL_OBJ_TRANSFORM,
|
||||
GBA_GL_OBJ_DIMS,
|
||||
|
||||
GBA_GL_COMPOSITE_SCALE = 2,
|
||||
GBA_GL_COMPOSITE_LAYERID,
|
||||
GBA_GL_COMPOSITE_LAYER,
|
||||
GBA_GL_COMPOSITE_LAYERFLAGS,
|
||||
GBA_GL_COMPOSITE_OLDLAYER,
|
||||
GBA_GL_COMPOSITE_OLDLAYERFLAGS,
|
||||
GBA_GL_COMPOSITE_OLDOLDFLAGS,
|
||||
GBA_GL_COMPOSITE_WINDOW,
|
||||
|
||||
GBA_GL_FINALIZE_SCALE = 2,
|
||||
GBA_GL_FINALIZE_LAYER,
|
||||
GBA_GL_FINALIZE_LAYERFLAGS,
|
||||
GBA_GL_FINALIZE_OLDLAYER,
|
||||
GBA_GL_FINALIZE_OLDFLAGS,
|
||||
|
||||
GBA_GL_UNIFORM_MAX = 12
|
||||
};
|
||||
|
||||
struct GBAVideoGLRenderer {
|
||||
struct GBAVideoRenderer d;
|
||||
|
||||
|
@ -103,10 +143,14 @@ struct GBAVideoGLRenderer {
|
|||
unsigned vramDirty;
|
||||
|
||||
GLuint bgProgram[6];
|
||||
GLuint bgUniforms[6][GBA_GL_UNIFORM_MAX];
|
||||
GLuint objProgram[2];
|
||||
GLuint objUniforms[2][GBA_GL_UNIFORM_MAX];
|
||||
|
||||
GLuint compositeProgram;
|
||||
GLuint compositeUniforms[GBA_GL_UNIFORM_MAX];
|
||||
GLuint finalizeProgram;
|
||||
GLuint finalizeUniforms[GBA_GL_UNIFORM_MAX];
|
||||
|
||||
GBARegisterDISPCNT dispcnt;
|
||||
|
||||
|
|
|
@ -43,6 +43,11 @@ static void _finalizeLayers(struct GBAVideoGLRenderer* renderer, int y);
|
|||
|
||||
#define TEST_LAYER_ENABLED(X) !renderer->disableBG[X] && glRenderer->bg[X].enabled == 4 && glRenderer->bg[X].priority == priority
|
||||
|
||||
struct GBAVideoGLUniform {
|
||||
const char* name;
|
||||
int type;
|
||||
};
|
||||
|
||||
static const GLchar* const _gl3Header =
|
||||
"#version 130\n";
|
||||
|
||||
|
@ -85,6 +90,19 @@ static const char* const _renderTile256 =
|
|||
" return color;\n"
|
||||
"}";
|
||||
|
||||
const static struct GBAVideoGLUniform _uniformsMode0[] = {
|
||||
{ "loc", GBA_GL_VS_LOC, },
|
||||
{ "maxPos", GBA_GL_VS_MAXPOS, },
|
||||
{ "vram", GBA_GL_BG_VRAM, },
|
||||
{ "palette", GBA_GL_BG_PALETTE, },
|
||||
{ "screenBase", GBA_GL_BG_SCREENBASE, },
|
||||
{ "charBase", GBA_GL_BG_CHARBASE, },
|
||||
{ "size", GBA_GL_BG_SIZE, },
|
||||
{ "offset", GBA_GL_BG_OFFSET, },
|
||||
{ "inflags", GBA_GL_BG_INFLAGS, },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
static const char* const _renderMode0 =
|
||||
"varying vec2 texCoord;\n"
|
||||
"uniform sampler2D vram;\n"
|
||||
|
@ -137,6 +155,20 @@ static const char* const _fetchTileNoOverflow =
|
|||
" return renderTile(coord);\n"
|
||||
"}";
|
||||
|
||||
const static struct GBAVideoGLUniform _uniformsMode2[] = {
|
||||
{ "loc", GBA_GL_VS_LOC, },
|
||||
{ "maxPos", GBA_GL_VS_MAXPOS, },
|
||||
{ "vram", GBA_GL_BG_VRAM, },
|
||||
{ "palette", GBA_GL_BG_PALETTE, },
|
||||
{ "screenBase", GBA_GL_BG_SCREENBASE, },
|
||||
{ "charBase", GBA_GL_BG_CHARBASE, },
|
||||
{ "size", GBA_GL_BG_SIZE, },
|
||||
{ "inflags", GBA_GL_BG_INFLAGS, },
|
||||
{ "offset", GBA_GL_BG_OFFSET, },
|
||||
{ "transform", GBA_GL_BG_TRANSFORM, },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
static const char* const _renderMode2 =
|
||||
"varying vec2 texCoord;\n"
|
||||
"uniform sampler2D vram;\n"
|
||||
|
@ -189,6 +221,20 @@ static const char* const _renderMode2 =
|
|||
" flags = inflags / flagCoeff;\n"
|
||||
"}";
|
||||
|
||||
const static struct GBAVideoGLUniform _uniformsObj[] = {
|
||||
{ "loc", GBA_GL_VS_LOC, },
|
||||
{ "maxPos", GBA_GL_VS_MAXPOS, },
|
||||
{ "vram", GBA_GL_OBJ_VRAM, },
|
||||
{ "palette", GBA_GL_OBJ_PALETTE, },
|
||||
{ "charBase", GBA_GL_OBJ_CHARBASE, },
|
||||
{ "stride", GBA_GL_OBJ_STRIDE, },
|
||||
{ "localPalette", GBA_GL_OBJ_LOCALPALETTE, },
|
||||
{ "inflags", GBA_GL_OBJ_INFLAGS, },
|
||||
{ "transform", GBA_GL_OBJ_TRANSFORM, },
|
||||
{ "dims", GBA_GL_OBJ_DIMS, },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
static const char* const _renderObj =
|
||||
"varying vec2 texCoord;\n"
|
||||
"uniform sampler2D vram;\n"
|
||||
|
@ -214,6 +260,20 @@ static const char* const _renderObj =
|
|||
" flags = inflags / flagCoeff;\n"
|
||||
"}";
|
||||
|
||||
const static struct GBAVideoGLUniform _uniformsComposite[] = {
|
||||
{ "loc", GBA_GL_VS_LOC, },
|
||||
{ "maxPos", GBA_GL_VS_MAXPOS, },
|
||||
{ "scale", GBA_GL_COMPOSITE_SCALE, },
|
||||
{ "layerId", GBA_GL_COMPOSITE_LAYERID, },
|
||||
{ "layer", GBA_GL_COMPOSITE_LAYER, },
|
||||
{ "layerFlags", GBA_GL_COMPOSITE_LAYERFLAGS, },
|
||||
{ "oldLayer", GBA_GL_COMPOSITE_OLDLAYER, },
|
||||
{ "oldLayerFlags", GBA_GL_COMPOSITE_OLDLAYERFLAGS, },
|
||||
{ "oldOldFlags", GBA_GL_COMPOSITE_OLDOLDFLAGS, },
|
||||
{ "window", GBA_GL_COMPOSITE_WINDOW, },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
static const char* const _composite =
|
||||
"varying vec2 texCoord;\n"
|
||||
"uniform int scale;\n"
|
||||
|
@ -261,6 +321,17 @@ static const char* const _composite =
|
|||
" }\n"
|
||||
"}";
|
||||
|
||||
const static struct GBAVideoGLUniform _uniformsFinalize[] = {
|
||||
{ "loc", GBA_GL_VS_LOC, },
|
||||
{ "maxPos", GBA_GL_VS_MAXPOS, },
|
||||
{ "scale", GBA_GL_FINALIZE_SCALE, },
|
||||
{ "layer", GBA_GL_FINALIZE_LAYER, },
|
||||
{ "layerFlags", GBA_GL_FINALIZE_LAYERFLAGS, },
|
||||
{ "oldLayer", GBA_GL_FINALIZE_OLDLAYER, },
|
||||
{ "oldFlags", GBA_GL_FINALIZE_OLDFLAGS, },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
static const char* const _finalize =
|
||||
"varying vec2 texCoord;\n"
|
||||
"uniform int scale;\n"
|
||||
|
@ -347,6 +418,13 @@ static void _initFramebufferTexture(GLuint tex, GLenum format, GLenum attachment
|
|||
glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, tex, 0);
|
||||
}
|
||||
|
||||
static void _lookupUniforms(GLuint program, GLuint* out, const struct GBAVideoGLUniform* uniforms) {
|
||||
size_t i;
|
||||
for (i = 0; uniforms[i].name; ++i) {
|
||||
out[uniforms[i].type] = glGetUniformLocation(program, uniforms[i].name);
|
||||
}
|
||||
}
|
||||
|
||||
void GBAVideoGLRendererInit(struct GBAVideoRenderer* renderer) {
|
||||
struct GBAVideoGLRenderer* glRenderer = (struct GBAVideoGLRenderer*) renderer;
|
||||
glGenFramebuffers(GBA_GL_FBO_MAX, glRenderer->fbo);
|
||||
|
@ -442,33 +520,41 @@ void GBAVideoGLRendererInit(struct GBAVideoRenderer* renderer) {
|
|||
|
||||
shaderBuffer[2] = _renderTile16;
|
||||
_compileShader(glRenderer, glRenderer->bgProgram[0], shaderBuffer, 3, vs, log);
|
||||
_lookupUniforms(glRenderer->bgProgram[0], glRenderer->bgUniforms[0], _uniformsMode0);
|
||||
|
||||
shaderBuffer[2] = _renderTile256;
|
||||
_compileShader(glRenderer, glRenderer->bgProgram[1], shaderBuffer, 3, vs, log);
|
||||
_lookupUniforms(glRenderer->bgProgram[1], glRenderer->bgUniforms[1], _uniformsMode0);
|
||||
|
||||
shaderBuffer[1] = _renderMode2;
|
||||
|
||||
shaderBuffer[2] = _fetchTileOverflow;
|
||||
_compileShader(glRenderer, glRenderer->bgProgram[2], shaderBuffer, 3, vs, log);
|
||||
_lookupUniforms(glRenderer->bgProgram[2], glRenderer->bgUniforms[2], _uniformsMode2);
|
||||
|
||||
shaderBuffer[2] = _fetchTileNoOverflow;
|
||||
_compileShader(glRenderer, glRenderer->bgProgram[3], shaderBuffer, 3, vs, log);
|
||||
_lookupUniforms(glRenderer->bgProgram[3], glRenderer->bgUniforms[3], _uniformsMode2);
|
||||
|
||||
shaderBuffer[1] = _renderObj;
|
||||
|
||||
shaderBuffer[2] = _renderTile16;
|
||||
_compileShader(glRenderer, glRenderer->objProgram[0], shaderBuffer, 3, vs, log);
|
||||
_lookupUniforms(glRenderer->objProgram[0], glRenderer->objUniforms[0], _uniformsObj);
|
||||
|
||||
shaderBuffer[2] = _renderTile256;
|
||||
_compileShader(glRenderer, glRenderer->objProgram[1], shaderBuffer, 3, vs, log);
|
||||
_lookupUniforms(glRenderer->objProgram[1], glRenderer->objUniforms[1], _uniformsObj);
|
||||
|
||||
shaderBuffer[1] = _composite;
|
||||
_compileShader(glRenderer, glRenderer->compositeProgram, shaderBuffer, 2, vs, log);
|
||||
_lookupUniforms(glRenderer->compositeProgram, glRenderer->compositeUniforms, _uniformsComposite);
|
||||
glBindFragDataLocation(glRenderer->compositeProgram, 2, "oldColor");
|
||||
glBindFragDataLocation(glRenderer->compositeProgram, 3, "oldFlags");
|
||||
|
||||
shaderBuffer[1] = _finalize;
|
||||
_compileShader(glRenderer, glRenderer->finalizeProgram, shaderBuffer, 2, vs, log);
|
||||
_lookupUniforms(glRenderer->finalizeProgram, glRenderer->finalizeUniforms, _uniformsFinalize);
|
||||
|
||||
glDeleteShader(vs);
|
||||
|
||||
|
@ -963,6 +1049,7 @@ static void _compositeLayer(struct GBAVideoGLRenderer* renderer, GLuint tex, GLu
|
|||
if ((y & 0x1F) != 0x1F) {
|
||||
return;
|
||||
}
|
||||
const GLuint* uniforms = renderer->compositeUniforms;
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, renderer->fbo[GBA_GL_FBO_COMPOSITE]);
|
||||
glViewport(0, 0, GBA_VIDEO_HORIZONTAL_PIXELS * renderer->scale, GBA_VIDEO_VERTICAL_PIXELS * renderer->scale);
|
||||
glScissor(0, (y & ~0x1F) * renderer->scale, GBA_VIDEO_HORIZONTAL_PIXELS * renderer->scale, 0x20 * renderer->scale);
|
||||
|
@ -979,16 +1066,16 @@ static void _compositeLayer(struct GBAVideoGLRenderer* renderer, GLuint tex, GLu
|
|||
glBindTexture(GL_TEXTURE_2D, renderer->layers[GBA_GL_TEX_COMPOSITE_OLD_FLAGS]);
|
||||
glActiveTexture(GL_TEXTURE0 + 5);
|
||||
glBindTexture(GL_TEXTURE_2D, renderer->layers[GBA_GL_TEX_WINDOW]);
|
||||
glUniform2i(0, 0x20, y & ~0x1F);
|
||||
glUniform2i(1, GBA_VIDEO_HORIZONTAL_PIXELS, GBA_VIDEO_VERTICAL_PIXELS);
|
||||
glUniform1i(2, renderer->scale);
|
||||
glUniform1i(3, 1 << id);
|
||||
glUniform1i(4, 0);
|
||||
glUniform1i(5, 1);
|
||||
glUniform1i(6, 2);
|
||||
glUniform1i(7, 3);
|
||||
glUniform1i(8, 4);
|
||||
glUniform1i(9, 5);
|
||||
glUniform2i(uniforms[GBA_GL_VS_LOC], 0x20, y & ~0x1F);
|
||||
glUniform2i(uniforms[GBA_GL_VS_MAXPOS], GBA_VIDEO_HORIZONTAL_PIXELS, GBA_VIDEO_VERTICAL_PIXELS);
|
||||
glUniform1i(uniforms[GBA_GL_COMPOSITE_SCALE], renderer->scale);
|
||||
glUniform1i(uniforms[GBA_GL_COMPOSITE_LAYERID], 1 << id);
|
||||
glUniform1i(uniforms[GBA_GL_COMPOSITE_LAYER], 0);
|
||||
glUniform1i(uniforms[GBA_GL_COMPOSITE_LAYERFLAGS], 1);
|
||||
glUniform1i(uniforms[GBA_GL_COMPOSITE_OLDLAYER], 2);
|
||||
glUniform1i(uniforms[GBA_GL_COMPOSITE_OLDLAYERFLAGS], 3);
|
||||
glUniform1i(uniforms[GBA_GL_COMPOSITE_OLDOLDFLAGS], 4);
|
||||
glUniform1i(uniforms[GBA_GL_COMPOSITE_WINDOW], 5);
|
||||
glVertexAttribPointer(0, 2, GL_INT, GL_FALSE, 0, _vertices);
|
||||
glEnableVertexAttribArray(0);
|
||||
glDrawBuffers(4, (GLenum[]) { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 });
|
||||
|
@ -1001,6 +1088,7 @@ void _finalizeLayers(struct GBAVideoGLRenderer* renderer, int y) {
|
|||
if ((y & 0x1F) != 0x1F) {
|
||||
return;
|
||||
}
|
||||
const GLuint* uniforms = renderer->finalizeUniforms;
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, renderer->fbo[GBA_GL_FBO_OUTPUT]);
|
||||
glViewport(0, 0, GBA_VIDEO_HORIZONTAL_PIXELS * renderer->scale, GBA_VIDEO_VERTICAL_PIXELS * renderer->scale);
|
||||
glScissor(0, (y & ~0x1F) * renderer->scale, GBA_VIDEO_HORIZONTAL_PIXELS * renderer->scale, 0x20 * renderer->scale);
|
||||
|
@ -1013,13 +1101,13 @@ void _finalizeLayers(struct GBAVideoGLRenderer* renderer, int y) {
|
|||
glBindTexture(GL_TEXTURE_2D, renderer->layers[GBA_GL_TEX_COMPOSITE_OLD_COLOR]);
|
||||
glActiveTexture(GL_TEXTURE0 + 3);
|
||||
glBindTexture(GL_TEXTURE_2D, renderer->layers[GBA_GL_TEX_COMPOSITE_OLD_FLAGS]);
|
||||
glUniform2i(0, 0x20, y & ~0x1F);
|
||||
glUniform2i(1, GBA_VIDEO_HORIZONTAL_PIXELS, GBA_VIDEO_VERTICAL_PIXELS);
|
||||
glUniform1i(2, renderer->scale);
|
||||
glUniform1i(3, 0);
|
||||
glUniform1i(4, 1);
|
||||
glUniform1i(5, 2);
|
||||
glUniform1i(6, 3);
|
||||
glUniform2i(uniforms[GBA_GL_VS_LOC], 0x20, y & ~0x1F);
|
||||
glUniform2i(uniforms[GBA_GL_VS_MAXPOS], GBA_VIDEO_HORIZONTAL_PIXELS, GBA_VIDEO_VERTICAL_PIXELS);
|
||||
glUniform1i(uniforms[GBA_GL_FINALIZE_SCALE], renderer->scale);
|
||||
glUniform1i(uniforms[GBA_GL_FINALIZE_LAYER], 0);
|
||||
glUniform1i(uniforms[GBA_GL_FINALIZE_LAYERFLAGS], 1);
|
||||
glUniform1i(uniforms[GBA_GL_FINALIZE_OLDLAYER], 2);
|
||||
glUniform1i(uniforms[GBA_GL_FINALIZE_OLDFLAGS], 3);
|
||||
glVertexAttribPointer(0, 2, GL_INT, GL_FALSE, 0, _vertices);
|
||||
glEnableVertexAttribArray(0);
|
||||
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
||||
|
@ -1053,6 +1141,7 @@ void GBAVideoGLRendererDrawSprite(struct GBAVideoGLRenderer* renderer, struct GB
|
|||
|
||||
enum GBAVideoBlendEffect blendEffect = GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_SEMITRANSPARENT ? BLEND_ALPHA : renderer->blendEffect;
|
||||
|
||||
const GLuint* uniforms = renderer->objUniforms[GBAObjAttributesAGet256Color(sprite->a)];
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, renderer->fbo[GBA_GL_FBO_OBJ]);
|
||||
glViewport(x * renderer->scale, spriteY * renderer->scale, totalWidth * renderer->scale, totalHeight * renderer->scale);
|
||||
glScissor(x * renderer->scale, y * renderer->scale, totalWidth * renderer->scale, renderer->scale);
|
||||
|
@ -1061,14 +1150,14 @@ void GBAVideoGLRendererDrawSprite(struct GBAVideoGLRenderer* renderer, struct GB
|
|||
glBindTexture(GL_TEXTURE_2D, renderer->vramTex);
|
||||
glActiveTexture(GL_TEXTURE0 + 1);
|
||||
glBindTexture(GL_TEXTURE_2D, renderer->paletteTex);
|
||||
glUniform2i(0, 1, y - spriteY);
|
||||
glUniform2i(1, (GBAObjAttributesBIsHFlip(sprite->b) && !GBAObjAttributesAIsTransformed(sprite->a)) ? -totalWidth : totalWidth, totalHeight);
|
||||
glUniform1i(2, 0);
|
||||
glUniform1i(3, 1);
|
||||
glUniform1i(4, charBase);
|
||||
glUniform1i(5, stride);
|
||||
glUniform1i(6, GBAObjAttributesCGetPalette(sprite->c));
|
||||
glUniform4i(7, GBAObjAttributesCGetPriority(sprite->c) << 3,
|
||||
glUniform2i(uniforms[GBA_GL_VS_LOC], 1, y - spriteY);
|
||||
glUniform2i(uniforms[GBA_GL_VS_MAXPOS], (GBAObjAttributesBIsHFlip(sprite->b) && !GBAObjAttributesAIsTransformed(sprite->a)) ? -totalWidth : totalWidth, totalHeight);
|
||||
glUniform1i(uniforms[GBA_GL_OBJ_VRAM], 0);
|
||||
glUniform1i(uniforms[GBA_GL_OBJ_PALETTE], 1);
|
||||
glUniform1i(uniforms[GBA_GL_OBJ_CHARBASE], charBase);
|
||||
glUniform1i(uniforms[GBA_GL_OBJ_STRIDE], stride);
|
||||
glUniform1i(uniforms[GBA_GL_OBJ_LOCALPALETTE], GBAObjAttributesCGetPalette(sprite->c));
|
||||
glUniform4i(uniforms[GBA_GL_OBJ_INFLAGS], GBAObjAttributesCGetPriority(sprite->c) << 3,
|
||||
(renderer->target1Obj || GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_SEMITRANSPARENT) | (renderer->target2Obj * 2) | (blendEffect * 4),
|
||||
blendEffect == BLEND_ALPHA ? renderer->blda : renderer->bldy, renderer->bldb);
|
||||
if (GBAObjAttributesAIsTransformed(sprite->a)) {
|
||||
|
@ -1078,11 +1167,11 @@ void GBAVideoGLRendererDrawSprite(struct GBAVideoGLRenderer* renderer, struct GB
|
|||
LOAD_16(mat.c, 0, &renderer->d.oam->mat[GBAObjAttributesBGetMatIndex(sprite->b)].c);
|
||||
LOAD_16(mat.d, 0, &renderer->d.oam->mat[GBAObjAttributesBGetMatIndex(sprite->b)].d);
|
||||
|
||||
glUniformMatrix2fv(8, 1, GL_FALSE, (GLfloat[]) { mat.a / 256.f, mat.c / 256.f, mat.b / 256.f, mat.d / 256.f });
|
||||
glUniformMatrix2fv(uniforms[GBA_GL_OBJ_TRANSFORM], 1, GL_FALSE, (GLfloat[]) { mat.a / 256.f, mat.c / 256.f, mat.b / 256.f, mat.d / 256.f });
|
||||
} else {
|
||||
glUniformMatrix2fv(8, 1, GL_FALSE, (GLfloat[]) { 1.f, 0, 0, 1.f });
|
||||
glUniformMatrix2fv(uniforms[GBA_GL_OBJ_TRANSFORM], 1, GL_FALSE, (GLfloat[]) { 1.f, 0, 0, 1.f });
|
||||
}
|
||||
glUniform4i(9, width, height, totalWidth, totalHeight);
|
||||
glUniform4i(uniforms[GBA_GL_OBJ_DIMS], width, height, totalWidth, totalHeight);
|
||||
glVertexAttribPointer(0, 2, GL_INT, GL_FALSE, 0, _vertices);
|
||||
glEnableVertexAttribArray(0);
|
||||
glDrawBuffers(2, (GLenum[]) { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 });
|
||||
|
@ -1098,6 +1187,7 @@ void GBAVideoGLRendererDrawBackgroundMode0(struct GBAVideoGLRenderer* renderer,
|
|||
} else if (background->size == 3) {
|
||||
yBase += (inY & 0x100) << 1;
|
||||
}
|
||||
const GLuint* uniforms = renderer->bgUniforms[background->multipalette ? 1 : 0];
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, background->fbo);
|
||||
glViewport(0, 0, GBA_VIDEO_HORIZONTAL_PIXELS * renderer->scale, GBA_VIDEO_VERTICAL_PIXELS * renderer->scale);
|
||||
glScissor(0, y * renderer->scale, GBA_VIDEO_HORIZONTAL_PIXELS * renderer->scale, renderer->scale);
|
||||
|
@ -1106,17 +1196,17 @@ void GBAVideoGLRendererDrawBackgroundMode0(struct GBAVideoGLRenderer* renderer,
|
|||
glBindTexture(GL_TEXTURE_2D, renderer->vramTex);
|
||||
glActiveTexture(GL_TEXTURE0 + 1);
|
||||
glBindTexture(GL_TEXTURE_2D, renderer->paletteTex);
|
||||
glUniform2i(0, 1, y);
|
||||
glUniform2i(1, GBA_VIDEO_HORIZONTAL_PIXELS, GBA_VIDEO_VERTICAL_PIXELS);
|
||||
glUniform1i(2, 0);
|
||||
glUniform1i(3, 1);
|
||||
glUniform1i(4, background->screenBase);
|
||||
glUniform1i(5, background->charBase);
|
||||
glUniform1i(6, background->size);
|
||||
glUniform2i(7, background->x, yBase - y);
|
||||
glUniform4i(8, (background->priority << 3) + (background->index << 1) + 1,
|
||||
background->target1 | (background->target2 * 2) | (renderer->blendEffect * 4),
|
||||
renderer->blendEffect == BLEND_ALPHA ? renderer->blda : renderer->bldy, renderer->bldb);
|
||||
glUniform2i(uniforms[GBA_GL_VS_LOC], 1, y);
|
||||
glUniform2i(uniforms[GBA_GL_VS_MAXPOS], GBA_VIDEO_HORIZONTAL_PIXELS, GBA_VIDEO_VERTICAL_PIXELS);
|
||||
glUniform1i(uniforms[GBA_GL_BG_VRAM], 0);
|
||||
glUniform1i(uniforms[GBA_GL_BG_PALETTE], 1);
|
||||
glUniform1i(uniforms[GBA_GL_BG_SCREENBASE], background->screenBase);
|
||||
glUniform1i(uniforms[GBA_GL_BG_CHARBASE], background->charBase);
|
||||
glUniform1i(uniforms[GBA_GL_BG_SIZE], background->size);
|
||||
glUniform2i(uniforms[GBA_GL_BG_OFFSET], background->x, yBase - y);
|
||||
glUniform4i(uniforms[GBA_GL_BG_INFLAGS], (background->priority << 3) + (background->index << 1) + 1,
|
||||
background->target1 | (background->target2 * 2) | (renderer->blendEffect * 4),
|
||||
renderer->blendEffect == BLEND_ALPHA ? renderer->blda : renderer->bldy, renderer->bldb);
|
||||
glVertexAttribPointer(0, 2, GL_INT, GL_FALSE, 0, _vertices);
|
||||
glEnableVertexAttribArray(0);
|
||||
glDrawBuffers(2, (GLenum[]) { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 });
|
||||
|
@ -1127,6 +1217,7 @@ void GBAVideoGLRendererDrawBackgroundMode0(struct GBAVideoGLRenderer* renderer,
|
|||
}
|
||||
|
||||
void GBAVideoGLRendererDrawBackgroundMode2(struct GBAVideoGLRenderer* renderer, struct GBAVideoGLBackground* background, int y) {
|
||||
const GLuint* uniforms = renderer->bgUniforms[background->overflow ? 2 : 3];
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, background->fbo);
|
||||
glViewport(0, 0, GBA_VIDEO_HORIZONTAL_PIXELS * renderer->scale, GBA_VIDEO_VERTICAL_PIXELS * renderer->scale);
|
||||
glScissor(0, y * renderer->scale, GBA_VIDEO_HORIZONTAL_PIXELS * renderer->scale, renderer->scale);
|
||||
|
@ -1135,37 +1226,37 @@ void GBAVideoGLRendererDrawBackgroundMode2(struct GBAVideoGLRenderer* renderer,
|
|||
glBindTexture(GL_TEXTURE_2D, renderer->vramTex);
|
||||
glActiveTexture(GL_TEXTURE0 + 1);
|
||||
glBindTexture(GL_TEXTURE_2D, renderer->paletteTex);
|
||||
glUniform2i(0, 1, y);
|
||||
glUniform2i(1, GBA_VIDEO_HORIZONTAL_PIXELS, GBA_VIDEO_VERTICAL_PIXELS);
|
||||
glUniform1i(2, 0);
|
||||
glUniform1i(3, 1);
|
||||
glUniform1i(4, background->screenBase);
|
||||
glUniform1i(5, background->charBase);
|
||||
glUniform1i(6, background->size);
|
||||
glUniform4i(7, (background->priority << 3) + (background->index << 1) + 1,
|
||||
glUniform2i(uniforms[GBA_GL_VS_LOC], 1, y);
|
||||
glUniform2i(uniforms[GBA_GL_VS_MAXPOS], GBA_VIDEO_HORIZONTAL_PIXELS, GBA_VIDEO_VERTICAL_PIXELS);
|
||||
glUniform1i(uniforms[GBA_GL_BG_VRAM], 0);
|
||||
glUniform1i(uniforms[GBA_GL_BG_PALETTE], 1);
|
||||
glUniform1i(uniforms[GBA_GL_BG_SCREENBASE], background->screenBase);
|
||||
glUniform1i(uniforms[GBA_GL_BG_CHARBASE], background->charBase);
|
||||
glUniform1i(uniforms[GBA_GL_BG_SIZE], background->size);
|
||||
glUniform4i(uniforms[GBA_GL_BG_INFLAGS], (background->priority << 3) + (background->index << 1) + 1,
|
||||
background->target1 | (background->target2 * 2) | (renderer->blendEffect * 4),
|
||||
renderer->blendEffect == BLEND_ALPHA ? renderer->blda : renderer->bldy, renderer->bldb);
|
||||
if (renderer->scale > 1) {
|
||||
glUniform2iv(8, 4, (GLint[]) {
|
||||
glUniform2iv(uniforms[GBA_GL_BG_OFFSET], 4, (GLint[]) {
|
||||
background->affine[0].sx, background->affine[0].sy,
|
||||
background->affine[1].sx, background->affine[1].sy,
|
||||
background->affine[2].sx, background->affine[2].sy,
|
||||
background->affine[3].sx, background->affine[3].sy,
|
||||
});
|
||||
glUniform2iv(12, 4, (GLint[]) {
|
||||
glUniform2iv(uniforms[GBA_GL_BG_TRANSFORM], 4, (GLint[]) {
|
||||
background->affine[0].dx, background->affine[0].dy,
|
||||
background->affine[1].dx, background->affine[1].dy,
|
||||
background->affine[2].dx, background->affine[2].dy,
|
||||
background->affine[3].dx, background->affine[3].dy,
|
||||
});
|
||||
} else {
|
||||
glUniform2iv(8, 4, (GLint[]) {
|
||||
glUniform2iv(uniforms[GBA_GL_BG_OFFSET], 4, (GLint[]) {
|
||||
background->affine[0].sx, background->affine[0].sy,
|
||||
background->affine[0].sx, background->affine[0].sy,
|
||||
background->affine[0].sx, background->affine[0].sy,
|
||||
background->affine[0].sx, background->affine[0].sy,
|
||||
});
|
||||
glUniform2iv(12, 4, (GLint[]) {
|
||||
glUniform2iv(uniforms[GBA_GL_BG_TRANSFORM], 4, (GLint[]) {
|
||||
background->affine[0].dx, background->affine[0].dy,
|
||||
background->affine[0].dx, background->affine[0].dy,
|
||||
background->affine[0].dx, background->affine[0].dy,
|
||||
|
|
Loading…
Reference in New Issue