OpenGL: Add integer scaling forcing and a pixelate filter

This commit is contained in:
Jeffrey Pfau 2016-01-23 02:34:27 -08:00
parent d6bccd80f7
commit 380f6dbe7e
3 changed files with 25 additions and 6 deletions

View File

@ -0,0 +1,9 @@
[shader]
name=Pixelate
author=endrift
description=Only scale up the screen at an integer ratio
passes=1
[pass.0]
blend=1
integerScaling=1

View File

@ -135,8 +135,8 @@ static void GBAGLES2ContextInit(struct VideoBackend* v, WHandle handle) {
uniforms[3].max.fvec3[0] = 1.0f; uniforms[3].max.fvec3[0] = 1.0f;
uniforms[3].max.fvec3[1] = 1.0f; uniforms[3].max.fvec3[1] = 1.0f;
uniforms[3].max.fvec3[2] = 1.0f; uniforms[3].max.fvec3[2] = 1.0f;
GBAGLES2ShaderInit(&context->initialShader, _vertexShader, _fragmentShader, -1, -1, uniforms, 4); GBAGLES2ShaderInit(&context->initialShader, _vertexShader, _fragmentShader, -1, -1, false, uniforms, 4);
GBAGLES2ShaderInit(&context->finalShader, 0, 0, 0, 0, 0, 0); GBAGLES2ShaderInit(&context->finalShader, 0, 0, 0, 0, false, 0, 0);
glDeleteFramebuffers(1, &context->finalShader.fbo); glDeleteFramebuffers(1, &context->finalShader.fbo);
context->finalShader.fbo = 0; context->finalShader.fbo = 0;
} }
@ -195,6 +195,12 @@ void _drawShader(struct GBAGLES2Shader* shader) {
drawH = viewport[3]; drawH = viewport[3];
padH = viewport[1]; padH = viewport[1];
} }
if (shader->integerScaling) {
padW = 0;
padH = 0;
drawW -= drawW % VIDEO_HORIZONTAL_PIXELS;
drawH -= drawH % VIDEO_VERTICAL_PIXELS;
}
glViewport(padW, padH, drawW, drawH); glViewport(padW, padH, drawW, drawH);
if (!shader->width || !shader->height) { if (!shader->width || !shader->height) {
GLint oldTex; GLint oldTex;
@ -204,7 +210,7 @@ void _drawShader(struct GBAGLES2Shader* shader) {
glBindTexture(GL_TEXTURE_2D, oldTex); glBindTexture(GL_TEXTURE_2D, oldTex);
} }
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, shader->filter ? GL_LINEAR : GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, shader->filter ? GL_LINEAR : GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, shader->filter ? GL_LINEAR : GL_NEAREST);
glUseProgram(shader->program); glUseProgram(shader->program);
glUniform1i(shader->texLocation, 0); glUniform1i(shader->texLocation, 0);
@ -310,9 +316,10 @@ void GBAGLES2ContextCreate(struct GBAGLES2Context* context) {
context->nShaders = 0; context->nShaders = 0;
} }
void GBAGLES2ShaderInit(struct GBAGLES2Shader* shader, const char* vs, const char* fs, int width, int height, struct GBAGLES2Uniform* uniforms, size_t nUniforms) { void GBAGLES2ShaderInit(struct GBAGLES2Shader* shader, const char* vs, const char* fs, int width, int height, bool integerScaling, struct GBAGLES2Uniform* uniforms, size_t nUniforms) {
shader->width = width >= 0 ? width : VIDEO_HORIZONTAL_PIXELS; shader->width = width >= 0 ? width : VIDEO_HORIZONTAL_PIXELS;
shader->height = height >= 0 ? height : VIDEO_VERTICAL_PIXELS; shader->height = height >= 0 ? height : VIDEO_VERTICAL_PIXELS;
shader->integerScaling = integerScaling;
shader->filter = false; shader->filter = false;
shader->blend = false; shader->blend = false;
shader->uniforms = uniforms; shader->uniforms = uniforms;
@ -802,8 +809,10 @@ bool GBAGLES2ShaderLoad(struct VideoShader* shader, struct VDir* dir) {
} }
int width = 0; int width = 0;
int height = 0; int height = 0;
int scaling = 0;
_lookupIntValue(&description, passName, "width", &width); _lookupIntValue(&description, passName, "width", &width);
_lookupIntValue(&description, passName, "height", &height); _lookupIntValue(&description, passName, "height", &height);
_lookupIntValue(&description, passName, "integerScaling", &scaling);
struct GBAGLES2UniformList uniformVector; struct GBAGLES2UniformList uniformVector;
GBAGLES2UniformListInit(&uniformVector, 0); GBAGLES2UniformListInit(&uniformVector, 0);
@ -821,7 +830,7 @@ bool GBAGLES2ShaderLoad(struct VideoShader* shader, struct VDir* dir) {
memcpy(uniformBlock, GBAGLES2UniformListGetPointer(&uniformVector, 0), sizeof(*uniformBlock) * u); memcpy(uniformBlock, GBAGLES2UniformListGetPointer(&uniformVector, 0), sizeof(*uniformBlock) * u);
GBAGLES2UniformListDeinit(&uniformVector); GBAGLES2UniformListDeinit(&uniformVector);
GBAGLES2ShaderInit(&shaderBlock[n], vssrc, fssrc, width, height, uniformBlock, u); GBAGLES2ShaderInit(&shaderBlock[n], vssrc, fssrc, width, height, scaling, uniformBlock, u);
int b = 0; int b = 0;
_lookupIntValue(&description, passName, "blend", &b); _lookupIntValue(&description, passName, "blend", &b);
if (b) { if (b) {

View File

@ -53,6 +53,7 @@ struct GBAGLES2Uniform {
struct GBAGLES2Shader { struct GBAGLES2Shader {
unsigned width; unsigned width;
unsigned height; unsigned height;
bool integerScaling;
bool filter; bool filter;
bool blend; bool blend;
GLuint tex; GLuint tex;
@ -83,7 +84,7 @@ struct GBAGLES2Context {
void GBAGLES2ContextCreate(struct GBAGLES2Context*); void GBAGLES2ContextCreate(struct GBAGLES2Context*);
void GBAGLES2ShaderInit(struct GBAGLES2Shader*, const char* vs, const char* fs, int width, int height, struct GBAGLES2Uniform* uniforms, size_t nUniforms); void GBAGLES2ShaderInit(struct GBAGLES2Shader*, const char* vs, const char* fs, int width, int height, bool integerScaling, struct GBAGLES2Uniform* uniforms, size_t nUniforms);
void GBAGLES2ShaderDeinit(struct GBAGLES2Shader*); void GBAGLES2ShaderDeinit(struct GBAGLES2Shader*);
void GBAGLES2ShaderAttach(struct GBAGLES2Context*, struct GBAGLES2Shader*, size_t nShaders); void GBAGLES2ShaderAttach(struct GBAGLES2Context*, struct GBAGLES2Shader*, size_t nShaders);
void GBAGLES2ShaderDetach(struct GBAGLES2Context*); void GBAGLES2ShaderDetach(struct GBAGLES2Context*);