GBA Video: Fix VAOs on Nvidia

This commit is contained in:
Vicki Pfau 2019-05-14 23:33:54 -07:00
parent 3797e1e5f6
commit 06cc738b00
2 changed files with 17 additions and 5 deletions

View File

@ -428,7 +428,6 @@ void _compileShader(struct GBAVideoGLRenderer* glRenderer, struct GBAVideoGLShad
glBindBuffer(GL_ARRAY_BUFFER, glRenderer->vbo);
GLuint positionLocation = glGetAttribLocation(program, "position");
glVertexAttribPointer(positionLocation, 2, GL_INT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(positionLocation);
size_t i;
for (i = 0; uniforms[i].name; ++i) {
@ -1084,6 +1083,7 @@ static void _compositeLayer(struct GBAVideoGLRenderer* renderer, GLuint tex, GLu
glUniform1i(uniforms[GBA_GL_COMPOSITE_OLDOLDFLAGS], 4);
glUniform1i(uniforms[GBA_GL_COMPOSITE_WINDOW], 5);
glDrawBuffers(4, (GLenum[]) { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 });
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glDrawBuffers(1, (GLenum[]) { GL_COLOR_ATTACHMENT0 });
}
@ -1113,6 +1113,7 @@ void _finalizeLayers(struct GBAVideoGLRenderer* renderer, int y) {
glUniform1i(uniforms[GBA_GL_FINALIZE_LAYERFLAGS], 1);
glUniform1i(uniforms[GBA_GL_FINALIZE_OLDLAYER], 2);
glUniform1i(uniforms[GBA_GL_FINALIZE_OLDFLAGS], 3);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
@ -1185,6 +1186,7 @@ void GBAVideoGLRendererDrawSprite(struct GBAVideoGLRenderer* renderer, struct GB
glUniform3f(uniforms[GBA_GL_OBJ_OBJWIN], 0, 0, 0);
glDrawBuffers(2, (GLenum[]) { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 });
}
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glDrawBuffers(1, (GLenum[]) { GL_COLOR_ATTACHMENT0 });
}
@ -1221,6 +1223,7 @@ void GBAVideoGLRendererDrawBackgroundMode0(struct GBAVideoGLRenderer* renderer,
background->target1 | (background->target2 * 2) | (renderer->blendEffect * 4),
renderer->blendEffect == BLEND_ALPHA ? renderer->blda : renderer->bldy, renderer->bldb);
glDrawBuffers(2, (GLenum[]) { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 });
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glDrawBuffers(1, (GLenum[]) { GL_COLOR_ATTACHMENT0 });
@ -1277,6 +1280,7 @@ void GBAVideoGLRendererDrawBackgroundMode2(struct GBAVideoGLRenderer* renderer,
});
}
glDrawBuffers(2, (GLenum[]) { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 });
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glDrawBuffers(1, (GLenum[]) { GL_COLOR_ATTACHMENT0 });

View File

@ -135,6 +135,15 @@ static void mGLES2ContextInit(struct VideoBackend* v, WHandle handle) {
uniforms[3].max.fvec3[2] = 1.0f;
mGLES2ShaderInit(&context->initialShader, _vertexShader, _fragmentShader, -1, -1, false, uniforms, 4);
mGLES2ShaderInit(&context->finalShader, 0, 0, 0, 0, false, 0, 0);
glBindVertexArray(context->initialShader.vao);
glBindBuffer(GL_ARRAY_BUFFER, context->vbo);
glVertexAttribPointer(context->initialShader.positionLocation, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glBindVertexArray(context->finalShader.vao);
glBindBuffer(GL_ARRAY_BUFFER, context->vbo);
glVertexAttribPointer(context->finalShader.positionLocation, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glBindVertexArray(0);
glDeleteFramebuffers(1, &context->finalShader.fbo);
glDeleteTextures(1, &context->finalShader.tex);
context->finalShader.fbo = 0;
@ -296,6 +305,7 @@ void _drawShader(struct mGLES2Context* context, struct mGLES2Shader* shader) {
break;
}
}
glEnableVertexAttribArray(shader->positionLocation);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glBindTexture(GL_TEXTURE_2D, shader->tex);
}
@ -426,10 +436,6 @@ void mGLES2ShaderInit(struct mGLES2Shader* shader, const char* vs, const char* f
}
glGenVertexArrays(1, &shader->vao);
glBindVertexArray(shader->vao);
glVertexAttribPointer(shader->positionLocation, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(shader->positionLocation);
glBindVertexArray(0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
@ -458,6 +464,8 @@ void mGLES2ShaderAttach(struct mGLES2Context* context, struct mGLES2Shader* shad
glBindVertexArray(context->shaders[i].vao);
glBindBuffer(GL_ARRAY_BUFFER, context->vbo);
glVertexAttribPointer(context->shaders[i].positionLocation, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(context->shaders[i].positionLocation);
}
glBindVertexArray(0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);