Enable FXAA on mobile. Hopefully the buildbot will copy the shader, too...

This commit is contained in:
Henrik Rydgard 2013-09-28 22:42:13 +02:00
parent 605b3c8cc0
commit a5d30d2f02
5 changed files with 66 additions and 26 deletions

View file

@ -178,11 +178,7 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename)
graphics->Get("DisableStencilTest", &bDisableStencilTest, false); graphics->Get("DisableStencilTest", &bDisableStencilTest, false);
graphics->Get("AlwaysDepthWrite", &bAlwaysDepthWrite, false); graphics->Get("AlwaysDepthWrite", &bAlwaysDepthWrite, false);
graphics->Get("LowQualitySplineBezier", &bLowQualitySplineBezier, false); graphics->Get("LowQualitySplineBezier", &bLowQualitySplineBezier, false);
#ifdef USING_GLES2
bFXAA = false;
#else
graphics->Get("FXAA", &bFXAA, false); graphics->Get("FXAA", &bFXAA, false);
#endif
IniFile::Section *sound = iniFile.GetOrCreateSection("Sound"); IniFile::Section *sound = iniFile.GetOrCreateSection("Sound");
sound->Get("Enable", &bEnableSound, true); sound->Get("Enable", &bEnableSound, true);

View file

@ -154,21 +154,37 @@ void DisableState() {
#endif #endif
} }
void FramebufferManager::SetNumExtraFBOs(int num) {
for (int i = 0; i < extraFBOs_.size(); i++) {
fbo_destroy(extraFBOs_[i]);
}
extraFBOs_.clear();
for (int i = 0; i < num; i++) {
// No depth/stencil for post processing
FBO *fbo = fbo_create(PSP_CoreParameter().renderWidth, PSP_CoreParameter().renderHeight, 1, false, FBO_8888);
extraFBOs_.push_back(fbo);
}
}
void FramebufferManager::CompileDraw2DProgram() { void FramebufferManager::CompileDraw2DProgram() {
if (!draw2dprogram_) { if (!draw2dprogram_) {
if (g_Config.bFXAA) { SetNumExtraFBOs(0);
draw2dprogram_ = glsl_create("assets/shaders/fxaa.vsh", "assets/shaders/fxaa.fsh"); draw2dprogram_ = glsl_create_source(basic_vs, tex_fs);
} else {
draw2dprogram_ = glsl_create_source(basic_vs, tex_fs);
}
glsl_bind(draw2dprogram_); glsl_bind(draw2dprogram_);
glUniform1i(draw2dprogram_->sampler0, 0); glUniform1i(draw2dprogram_->sampler0, 0);
float u_delta = 1.0f / PSP_CoreParameter().renderWidth;
float v_delta = 1.0f / PSP_CoreParameter().renderHeight;
if (g_Config.bFXAA) { if (g_Config.bFXAA) {
glUniform2f(glsl_uniform_loc(draw2dprogram_, "u_texcoordDelta"), u_delta, v_delta); useFXAA_ = true;
fxaaProgram_ = glsl_create("shaders/fxaa.vsh", "shaders/fxaa.fsh");
glsl_bind(fxaaProgram_);
glUniform1i(fxaaProgram_->sampler0, 0);
SetNumExtraFBOs(1);
float u_delta = 1.0f / PSP_CoreParameter().renderWidth;
float v_delta = 1.0f / PSP_CoreParameter().renderHeight;
glUniform2f(glsl_uniform_loc(fxaaProgram_, "u_texcoordDelta"), u_delta, v_delta);
} else {
fxaaProgram_ = 0;
useFXAA_ = false;
} }
glsl_unbind(); glsl_unbind();
@ -179,6 +195,8 @@ void FramebufferManager::DestroyDraw2DProgram() {
if (draw2dprogram_) { if (draw2dprogram_) {
glsl_destroy(draw2dprogram_); glsl_destroy(draw2dprogram_);
draw2dprogram_ = 0; draw2dprogram_ = 0;
glsl_destroy(fxaaProgram_);
fxaaProgram_ = 0;
} }
} }
@ -194,7 +212,11 @@ FramebufferManager::FramebufferManager() :
drawPixelsTex_(0), drawPixelsTex_(0),
drawPixelsTexFormat_(GE_FORMAT_INVALID), drawPixelsTexFormat_(GE_FORMAT_INVALID),
convBuf(0), convBuf(0),
draw2dprogram_(0) draw2dprogram_(0),
fxaaProgram_(0),
textureCache_(0),
shaderManager_(0),
useFXAA_(false)
#ifndef USING_GLES2 #ifndef USING_GLES2
, ,
pixelBufObj_(0), pixelBufObj_(0),
@ -246,6 +268,7 @@ FramebufferManager::~FramebufferManager() {
if (draw2dprogram_) { if (draw2dprogram_) {
glsl_destroy(draw2dprogram_); glsl_destroy(draw2dprogram_);
} }
SetNumExtraFBOs(0);
#ifndef USING_GLES2 #ifndef USING_GLES2
delete [] pixelBufObj_; delete [] pixelBufObj_;
@ -351,10 +374,10 @@ void FramebufferManager::DrawPixels(const u8 *framebuf, GEBufferFormat pixelForm
float x, y, w, h; float x, y, w, h;
CenterRect(&x, &y, &w, &h, 480.0f, 272.0f, (float)PSP_CoreParameter().pixelWidth, (float)PSP_CoreParameter().pixelHeight); CenterRect(&x, &y, &w, &h, 480.0f, 272.0f, (float)PSP_CoreParameter().pixelWidth, (float)PSP_CoreParameter().pixelHeight);
DrawActiveTexture(x, y, w, h, false, 480.0f / 512.0f); DrawActiveTexture(x, y, w, h, (float)PSP_CoreParameter().pixelWidth, (float)PSP_CoreParameter().pixelHeight, false, 480.0f / 512.0f);
} }
void FramebufferManager::DrawActiveTexture(float x, float y, float w, float h, bool flip, float uscale, float vscale, GLSLProgram *program) { void FramebufferManager::DrawActiveTexture(float x, float y, float w, float h, float destW, float destH, bool flip, float uscale, float vscale, GLSLProgram *program) {
float u2 = uscale; float u2 = uscale;
// Since we're flipping, 0 is down. That's where the scale goes. // Since we're flipping, 0 is down. That's where the scale goes.
float v1 = flip ? 1.0f : 1.0f - vscale; float v1 = flip ? 1.0f : 1.0f - vscale;
@ -364,14 +387,17 @@ void FramebufferManager::DrawActiveTexture(float x, float y, float w, float h, b
const float texCoords[8] = {0,v1, u2,v1, u2,v2, 0,v2}; const float texCoords[8] = {0,v1, u2,v1, u2,v2, 0,v2};
const GLubyte indices[4] = {0,1,3,2}; const GLubyte indices[4] = {0,1,3,2};
if(!program) { if (!draw2dprogram_) {
CompileDraw2DProgram(); CompileDraw2DProgram();
}
if (!program) {
program = draw2dprogram_; program = draw2dprogram_;
} }
glsl_bind(program); glsl_bind(program);
Matrix4x4 ortho; Matrix4x4 ortho;
ortho.setOrtho(0, (float)PSP_CoreParameter().pixelWidth, (float)PSP_CoreParameter().pixelHeight, 0, -1, 1); ortho.setOrtho(0, destW, destH, 0, -1, 1);
glUniformMatrix4fv(program->u_viewproj, 1, GL_FALSE, ortho.getReadPtr()); glUniformMatrix4fv(program->u_viewproj, 1, GL_FALSE, ortho.getReadPtr());
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
@ -753,16 +779,30 @@ void FramebufferManager::CopyDisplayToOutput() {
} }
if (vfb->fbo) { if (vfb->fbo) {
glstate.viewport.set(0, 0, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight);
DEBUG_LOG(SCEGE, "Displaying FBO %08x", vfb->fb_address); DEBUG_LOG(SCEGE, "Displaying FBO %08x", vfb->fb_address);
DisableState(); DisableState();
fbo_bind_color_as_texture(vfb->fbo, 0); fbo_bind_color_as_texture(vfb->fbo, 0);
if (useFXAA_ && extraFBOs_.size() == 1) {
// An additional pass, FXAA to the extra FBO.
fbo_bind_as_render_target(extraFBOs_[0]);
int fbo_w, fbo_h;
fbo_get_dimensions(extraFBOs_[0], &fbo_w, &fbo_h);
glstate.viewport.set(0, 0, fbo_w, fbo_h);
DrawActiveTexture(0, 0, fbo_w, fbo_h, fbo_w, fbo_h, true, 1.0f, 1.0f, fxaaProgram_);
fbo_unbind();
// Use the extra FBO, with applied FXAA, as a texture.
fbo_bind_color_as_texture(extraFBOs_[0], 0);
}
glstate.viewport.set(0, 0, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight);
// These are in the output display coordinates // These are in the output display coordinates
float x, y, w, h; float x, y, w, h;
CenterRect(&x, &y, &w, &h, 480.0f, 272.0f, (float)PSP_CoreParameter().pixelWidth, (float)PSP_CoreParameter().pixelHeight); CenterRect(&x, &y, &w, &h, 480.0f, 272.0f, (float)PSP_CoreParameter().pixelWidth, (float)PSP_CoreParameter().pixelHeight);
DrawActiveTexture(x, y, w, h, true, 480.0f / (float)vfb->width, 272.0f / (float)vfb->height); DrawActiveTexture(x, y, w, h, (float)PSP_CoreParameter().pixelWidth, (float)PSP_CoreParameter().pixelHeight, true, 480.0f / (float)vfb->width, 272.0f / (float)vfb->height);
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
} }
} }
@ -911,7 +951,7 @@ void FramebufferManager::BlitFramebuffer_(VirtualFramebuffer *src, VirtualFrameb
CompileDraw2DProgram(); CompileDraw2DProgram();
DrawActiveTexture(x, y, w, h, flip, upscale, vscale, draw2dprogram_); DrawActiveTexture(x, y, w, h, (float)PSP_CoreParameter().pixelWidth, (float)PSP_CoreParameter().pixelHeight, flip, upscale, vscale, draw2dprogram_);
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
fbo_unbind(); fbo_unbind();

View file

@ -125,7 +125,7 @@ public:
} }
void DrawPixels(const u8 *framebuf, GEBufferFormat pixelFormat, int linesize); void DrawPixels(const u8 *framebuf, GEBufferFormat pixelFormat, int linesize);
void DrawActiveTexture(float x, float y, float w, float h, bool flip = false, float uscale = 1.0f, float vscale = 1.0f, GLSLProgram *program = 0); void DrawActiveTexture(float x, float y, float w, float h, float destW, float destH, bool flip = false, float uscale = 1.0f, float vscale = 1.0f, GLSLProgram *program = 0);
void DestroyAllFBOs(); void DestroyAllFBOs();
void DecimateFBOs(); void DecimateFBOs();
@ -178,6 +178,8 @@ private:
void CompileDraw2DProgram(); void CompileDraw2DProgram();
void DestroyDraw2DProgram(); void DestroyDraw2DProgram();
void SetNumExtraFBOs(int num);
u32 displayFramebufPtr_; u32 displayFramebufPtr_;
u32 displayStride_; u32 displayStride_;
GEBufferFormat displayFormat_; GEBufferFormat displayFormat_;
@ -213,9 +215,14 @@ private:
u8 *convBuf; u8 *convBuf;
GLSLProgram *draw2dprogram_; GLSLProgram *draw2dprogram_;
GLSLProgram *fxaaProgram_;
TextureCache *textureCache_; TextureCache *textureCache_;
ShaderManager *shaderManager_; ShaderManager *shaderManager_;
bool useFXAA_;
// Used by antialiasing
std::vector<FBO *> extraFBOs_;
bool resized_; bool resized_;
bool useBufferedRendering_; bool useBufferedRendering_;

View file

@ -119,9 +119,7 @@ void GameSettingsScreen::CreateViews() {
graphicsSettings->Add(new CheckBox(&g_Config.bHardwareTransform, gs->T("Hardware Transform"))); graphicsSettings->Add(new CheckBox(&g_Config.bHardwareTransform, gs->T("Hardware Transform")));
graphicsSettings->Add(new CheckBox(&g_Config.bVertexCache, gs->T("Vertex Cache"))); graphicsSettings->Add(new CheckBox(&g_Config.bVertexCache, gs->T("Vertex Cache")));
graphicsSettings->Add(new CheckBox(&g_Config.bLowQualitySplineBezier, gs->T("Low quality spline/bezier curves (speed)"))); graphicsSettings->Add(new CheckBox(&g_Config.bLowQualitySplineBezier, gs->T("Low quality spline/bezier curves (speed)")));
#ifndef USING_GLES graphicsSettings->Add(new CheckBox(&g_Config.bFXAA, gs->T("FXAA antialiasing")))->OnClick.Handle(this, &GameSettingsScreen::OnResolutionChange);
graphicsSettings->Add(new CheckBox(&g_Config.bFXAA, gs->T("FXAA antialiasing")));
#endif
static const char *internalResolutions[] = {"Auto (1:1)", "1x PSP", "2x PSP", "3x PSP", "4x PSP", "5x PSP" }; static const char *internalResolutions[] = {"Auto (1:1)", "1x PSP", "2x PSP", "3x PSP", "4x PSP", "5x PSP" };
graphicsSettings->Add(new PopupMultiChoice(&g_Config.iInternalResolution, gs->T("Rendering Resolution"), internalResolutions, 0, ARRAY_SIZE(internalResolutions), gs, screenManager()))->OnClick.Handle(this, &GameSettingsScreen::OnResolutionChange); graphicsSettings->Add(new PopupMultiChoice(&g_Config.iInternalResolution, gs->T("Rendering Resolution"), internalResolutions, 0, ARRAY_SIZE(internalResolutions), gs, screenManager()))->OnClick.Handle(this, &GameSettingsScreen::OnResolutionChange);

View file

@ -1,4 +1,3 @@
#version 120
attribute vec4 a_position; attribute vec4 a_position;
attribute vec2 a_texcoord0; attribute vec2 a_texcoord0;
uniform mat4 u_viewproj; uniform mat4 u_viewproj;