summaryrefslogtreecommitdiff
path: root/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp
diff options
context:
space:
mode:
authorRyan Houdek <Sonicadvance1@gmail.com>2012-12-26 12:54:58 -0600
committerRyan Houdek <Sonicadvance1@gmail.com>2012-12-26 12:54:58 -0600
commit67c1c6b06247e8c3a91f1579d9d7637a4e892a7a (patch)
treea040fa716f03f2a415d2f5fd42bc1a9494a81a8c /Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp
parent0de073edead76770aaa3b05638d3ebaa5d5f64f8 (diff)
parent5169804a61841fdbce939538915f35d3df1acce1 (diff)
Merge branch 'GLES-software'
Diffstat (limited to 'Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp')
-rw-r--r--Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp197
1 files changed, 108 insertions, 89 deletions
diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp
index 0fefa16a93..32a6f98dd0 100644
--- a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp
+++ b/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp
@@ -16,17 +16,23 @@
// http://code.google.com/p/dolphin-emu/
#include "Common.h"
+#include <math.h>
#include "../../Plugin_VideoOGL/Src/GLUtil.h"
+#include "../../Plugin_VideoOGL/Src/RasterFont.h"
#include "SWRenderer.h"
#include "SWStatistics.h"
-#include "../../Plugin_VideoOGL/Src/RasterFont.h"
-
-#define VSYNC_ENABLED 0
static GLuint s_RenderTarget = 0;
+static GLint attr_pos = -1, attr_tex = -1;
+static GLint uni_tex = -1;
+static GLuint program;
+
+// Rasterfont isn't compatible with GLES
+#ifndef USE_GLES
RasterFont* s_pfont = NULL;
+#endif
void SWRenderer::Init()
{
@@ -34,71 +40,60 @@ void SWRenderer::Init()
void SWRenderer::Shutdown()
{
- glDeleteTextures(1, &s_RenderTarget);
+ glDeleteProgram(program);
+ glDeleteTextures(1, &s_RenderTarget);
+#ifndef USE_GLES
+ delete s_pfont;
+ s_pfont = 0;
+#endif
+}
- delete s_pfont;
- s_pfont = 0;
+void CreateShaders()
+{
+ static const char *fragShaderText =
+ "varying " PREC " vec2 TexCoordOut;\n"
+ "uniform " TEXTYPE " Texture;\n"
+ "void main() {\n"
+ " " PREC " vec4 tmpcolor;\n"
+ " tmpcolor = " TEXFUNC "(Texture, TexCoordOut);\n"
+ " gl_FragColor = tmpcolor;\n"
+ "}\n";
+ static const char *vertShaderText =
+ "attribute vec4 pos;\n"
+ "attribute vec2 TexCoordIn;\n "
+ "varying vec2 TexCoordOut;\n "
+ "void main() {\n"
+ " gl_Position = pos;\n"
+ " TexCoordOut = TexCoordIn;\n"
+ "}\n";
+
+ program = OpenGL_CompileProgram(vertShaderText, fragShaderText);
+
+ glUseProgram(program);
+
+ uni_tex = glGetUniformLocation(program, "Texture");
+ attr_pos = glGetAttribLocation(program, "pos");
+ attr_tex = glGetAttribLocation(program, "TexCoordIn");
}
void SWRenderer::Prepare()
{
- OpenGL_MakeCurrent();
-
- // Init extension support.
- if (glewInit() != GLEW_OK) {
- ERROR_LOG(VIDEO, "glewInit() failed!Does your video card support OpenGL 2.x?");
- return;
- }
-
- // Handle VSync on/off
-#ifdef _WIN32
- if (WGLEW_EXT_swap_control)
- wglSwapIntervalEXT(VSYNC_ENABLED);
- else
- ERROR_LOG(VIDEO, "no support for SwapInterval (framerate clamped to monitor refresh rate)Does your video card support OpenGL 2.x?");
-#elif defined(HAVE_X11) && HAVE_X11
- if (glXSwapIntervalSGI)
- glXSwapIntervalSGI(VSYNC_ENABLED);
- else
- ERROR_LOG(VIDEO, "no support for SwapInterval (framerate clamped to monitor refresh rate)");
-#endif
-
- glStencilFunc(GL_ALWAYS, 0, 0);
- // used by hw rasterizer if it enables blending and depth test
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glDepthFunc(GL_LEQUAL);
-
- glShadeModel(GL_SMOOTH);
- glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
- glClearDepth(1.0f);
- glEnable(GL_SCISSOR_TEST);
-
- glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment
-
- glDisable(GL_LIGHTING);
- glDisable(GL_BLEND);
- glDisable(GL_STENCIL_TEST);
- //glDisable(GL_SCISSOR_TEST);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- s_pfont = new RasterFont();
-
- // legacy multitexturing: select texture channel only.
- glActiveTexture(GL_TEXTURE0);
- glClientActiveTexture(GL_TEXTURE0);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-
- glGenTextures(1, &s_RenderTarget);
+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment
+ glGenTextures(1, &s_RenderTarget);
+
+ CreateShaders();
+ // TODO: Enable for GLES once RasterFont supports GLES
+#ifndef USE_GLES
+ s_pfont = new RasterFont();
glEnable(GL_TEXTURE_RECTANGLE_ARB);
+#endif
+ GL_REPORT_ERRORD();
}
void SWRenderer::RenderText(const char* pstr, int left, int top, u32 color)
{
+#ifndef USE_GLES
int nBackbufferWidth = (int)OpenGL_GetBackbufferWidth();
int nBackbufferHeight = (int)OpenGL_GetBackbufferHeight();
@@ -106,11 +101,12 @@ void SWRenderer::RenderText(const char* pstr, int left, int top, u32 color)
left * 2.0f / (float)nBackbufferWidth - 1,
1 - top * 2.0f / (float)nBackbufferHeight,
0, nBackbufferWidth, nBackbufferHeight, color);
+#endif
}
void SWRenderer::DrawDebugText()
{
- char debugtext_buffer[8192];
+ char debugtext_buffer[8192];
char *p = debugtext_buffer;
p[0] = 0;
@@ -138,48 +134,71 @@ void SWRenderer::DrawDebugText()
void SWRenderer::DrawTexture(u8 *texture, int width, int height)
{
- GLsizei glWidth = (GLsizei)OpenGL_GetBackbufferWidth();
- GLsizei glHeight = (GLsizei)OpenGL_GetBackbufferHeight();
+ GLsizei glWidth = (GLsizei)GLInterface->GetBackBufferWidth();
+ GLsizei glHeight = (GLsizei)GLInterface->GetBackBufferHeight();
// Update GLViewPort
glViewport(0, 0, glWidth, glHeight);
- glScissor(0, 0, glWidth, glHeight);
-
- glBindTexture(GL_TEXTURE_RECTANGLE_ARB, s_RenderTarget);
- glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
- glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
+ glScissor(0, 0, glWidth, glHeight);
+
+ glBindTexture(TEX2D, s_RenderTarget);
+
+ glTexImage2D(TEX2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
+ glTexParameteri(TEX2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(TEX2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ GLfloat u_max = (GLfloat)width;
+ GLfloat v_max = (GLfloat)glHeight;
+
+ static const GLfloat verts[4][2] = {
+ { -1, -1}, // Left top
+ { -1, 1}, // left bottom
+ { 1, 1}, // right bottom
+ { 1, -1} // right top
+ };
+ //Texture rectangle uses pixel coordinates
+#ifndef USE_GLES
+ static const GLfloat texverts[4][2] = {
+ {0, v_max},
+ {0, 0},
+ {u_max, 0},
+ {u_max, v_max}
+ };
+#else
+ static const GLfloat texverts[4][2] = {
+ {0, 1},
+ {0, 0},
+ {1, 0},
+ {1, 1}
+ };
+#endif
+ glVertexAttribPointer(attr_pos, 2, GL_FLOAT, GL_FALSE, 0, verts);
+ glVertexAttribPointer(attr_tex, 2, GL_FLOAT, GL_FALSE, 0, texverts);
+ glEnableVertexAttribArray(attr_pos);
+ glEnableVertexAttribArray(attr_tex);
+ glActiveTexture(GL_TEXTURE0);
+ glUniform1i(uni_tex, 0);
+ glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+ glDisableVertexAttribArray(attr_pos);
+ glDisableVertexAttribArray(attr_tex);
+
+ glBindTexture(TEX2D, 0);
GL_REPORT_ERRORD();
-
- GLfloat u_max = (GLfloat)width;
- GLfloat v_max = (GLfloat)glHeight;
-
- glBegin(GL_QUADS);
- glTexCoord2f(0, v_max); glVertex2f(-1, -1);
- glTexCoord2f(0, 0); glVertex2f(-1, 1);
- glTexCoord2f(u_max, 0); glVertex2f( 1, 1);
- glTexCoord2f(u_max, v_max); glVertex2f( 1, -1);
- glEnd();
-
- glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
}
void SWRenderer::SwapBuffer()
{
- DrawDebugText();
+ DrawDebugText();
- glFlush();
+ glFlush();
- OpenGL_SwapBuffers();
+ GLInterface->Swap();
- GL_REPORT_ERRORD();
-
- swstats.ResetFrame();
+ swstats.ResetFrame();
- // Clear framebuffer
- glClearColor(0, 0, 0, 0);
- glClearDepth(1.0);
+#ifndef USE_GLES
+ glClearDepth(1.0f);
+#endif
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
GL_REPORT_ERRORD();