gsdx ogl: GLes

* use gles header file, disable opengl code (mainly GLX, ARB_sso, geometry shader)
* Define properly the function pointer, GLES use basic linking whereas GL must get the symbol dynamically
* cmake: properly search and set libglesv2.so
* don't use dual source blending => HW renderer work (only miss unimportant FBA)



git-svn-id: http://pcsx2.googlecode.com/svn/trunk@5701 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
gregory.hainaut 2013-07-13 11:39:45 +00:00
parent bd5f379044
commit 916a091f8a
16 changed files with 200 additions and 17 deletions

27
cmake/FindGLES2.cmake Normal file
View File

@ -0,0 +1,27 @@
# Try to find GLESV2
# Once done, this will define
#
# GLESV2_FOUND - system has GLESV2
# GLESV2_INCLUDE_DIR - the GLESV2 include directories
# GLESV2_LIBRARIES - link these to use GLESV2
if(GLESV2_INCLUDE_DIR AND GLESV2_LIBRARIES)
set(GLESV2_FIND_QUIETLY TRUE)
endif(GLESV2_INCLUDE_DIR AND GLESV2_LIBRARIES)
INCLUDE(CheckCXXSymbolExists)
# include dir
find_path(GLESV2_INCLUDE_DIR GLES3/gl3ext.h)
# finally the library itself
find_library(libGLESV2 NAMES GLESv2)
set(GLESV2_LIBRARIES ${libGLESV2})
# handle the QUIETLY and REQUIRED arguments and set GLESV2_FOUND to TRUE if
# all listed variables are TRUE
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GLESV2 DEFAULT_MSG GLESV2_LIBRARIES GLESV2_INCLUDE_DIR)
mark_as_advanced(GLESV2_LIBRARIES GLESV2_INCLUDE_DIR)

View File

@ -56,6 +56,7 @@ include(FindAio)
include(FindCg)
#endif(NOT GLSL_API)
include(FindEGL)
include(FindGLES2)
include(FindGlew)
include(FindLibc)
include(FindPortAudio)
@ -115,6 +116,10 @@ if(GLEW_FOUND)
include_directories(${GLEW_INCLUDE_DIR})
endif(GLEW_FOUND)
if(GLESV2_FOUND)
include_directories(${GLESV2_INCLUDE_DIR})
endif()
if(OPENGL_FOUND)
include_directories(${OPENGL_INCLUDE_DIR})
endif(OPENGL_FOUND)

View File

@ -44,7 +44,7 @@ if(XDG_STD)
add_definitions(-DXDG_STD)
endif(XDG_STD)
if(GLES_API)
if(GLES_API AND GLESV2_FOUND)
add_definitions(-DENABLE_GLES)
endif()
@ -193,10 +193,9 @@ endif()
add_library(${Output} SHARED ${GSdxSources} ${GSdxHeaders})
target_link_libraries(${Output} ${X11_LIBRARIES})
message(INFO "DEBUG ${OPENGL_LIBRARIES}")
if (GLES)
target_link_libraries(${Output} /usr/lib/i386-linux-gnu/libGLU.so;/usr/lib/i386-linux-gnu/libGLESv2.so;/usr/lib/i386-linux-gnu/libSM.so;/usr/lib/i386-linux-gnu/libICE.so;/usr/lib/i386-linux-gnu/libX11.so;/usr/lib/i386-linux-gnu/libXext.so)
if(GLES_API AND GLESV2_FOUND)
target_link_libraries(${Output} ${GLESV2_LIBRARIES})
else()
target_link_libraries(${Output} ${OPENGL_LIBRARIES})
endif()

View File

@ -23,6 +23,7 @@
#include "GLLoader.h"
#include "GSdx.h"
#ifndef ENABLE_GLES
PFNGLACTIVETEXTUREPROC gl_ActiveTexture = NULL;
PFNGLBLENDCOLORPROC gl_BlendColor = NULL;
PFNGLATTACHSHADERPROC gl_AttachShader = NULL;
@ -98,6 +99,7 @@ PFNGLPROGRAMUNIFORM1IPROC gl_ProgramUniform1i = NULL;
PFNGLGETUNIFORMBLOCKINDEXPROC gl_GetUniformBlockIndex = NULL;
PFNGLUNIFORMBLOCKBINDINGPROC gl_UniformBlockBinding = NULL;
PFNGLGETUNIFORMLOCATIONPROC gl_GetUniformLocation = NULL;
#endif
namespace GLLoader {

View File

@ -21,6 +21,7 @@
#pragma once
#ifndef ENABLE_GLES
extern PFNGLACTIVETEXTUREPROC gl_ActiveTexture;
extern PFNGLBLENDCOLORPROC gl_BlendColor;
extern PFNGLATTACHSHADERPROC gl_AttachShader;
@ -96,6 +97,83 @@ extern PFNGLPROGRAMUNIFORM1IPROC gl_ProgramUniform1i;
extern PFNGLGETUNIFORMBLOCKINDEXPROC gl_GetUniformBlockIndex;
extern PFNGLUNIFORMBLOCKBINDINGPROC gl_UniformBlockBinding;
extern PFNGLGETUNIFORMLOCATIONPROC gl_GetUniformLocation;
#else
#define gl_ActiveTexture glActiveTexture
#define gl_BlendColor glBlendColor
#define gl_AttachShader glAttachShader
#define gl_BindBuffer glBindBuffer
#define gl_BindBufferBase glBindBufferBase
#define gl_BindFragDataLocationIndexed glBindFragDataLocationIndexed
#define gl_BindFramebuffer glBindFramebuffer
#define gl_BindSampler glBindSampler
#define gl_BindVertexArray glBindVertexArray
#define gl_BlendEquationSeparate glBlendEquationSeparate
#define gl_BlendFuncSeparate glBlendFuncSeparate
#define gl_BlitFramebuffer glBlitFramebuffer
#define gl_BufferData glBufferData
#define gl_CheckFramebufferStatus glCheckFramebufferStatus
#define gl_ClearBufferfv glClearBufferfv
#define gl_ClearBufferiv glClearBufferiv
#define gl_CompileShader glCompileShader
#define gl_CopyImageSubDataNV glCopyImageSubDataNV
#define gl_CreateProgram glCreateProgram
#define gl_CreateShader glCreateShader
#define gl_CreateShaderProgramv glCreateShaderProgramv
#define gl_DeleteBuffers glDeleteBuffers
#define gl_DeleteFramebuffers glDeleteFramebuffers
#define gl_DeleteProgram glDeleteProgram
#define gl_DeleteSamplers glDeleteSamplers
#define gl_DeleteShader glDeleteShader
#define gl_DeleteVertexArrays glDeleteVertexArrays
#define gl_DetachShader glDetachShader
#define gl_DrawBuffers glDrawBuffers
#define gl_DrawElementsBaseVertex glDrawElementsBaseVertex
#define gl_EnableVertexAttribArray glEnableVertexAttribArray
#define gl_FramebufferRenderbuffer glFramebufferRenderbuffer
#define gl_FramebufferTexture2D glFramebufferTexture2D
#define gl_GenBuffers glGenBuffers
#define gl_GenFramebuffers glGenFramebuffers
#define gl_GenSamplers glGenSamplers
#define gl_GenVertexArrays glGenVertexArrays
#define gl_GetBufferParameteriv glGetBufferParameteriv
#define gl_GetDebugMessageLogARB glGetDebugMessageLogARB
#define gl_GetFragDataIndex glGetFragDataIndex
#define gl_GetFragDataLocation glGetFragDataLocation
#define gl_GetProgramInfoLog glGetProgramInfoLog
#define gl_GetProgramiv glGetProgramiv
#define gl_GetShaderiv glGetShaderiv
#define gl_GetStringi glGetStringi
#define gl_IsFramebuffer glIsFramebuffer
#define gl_LinkProgram glLinkProgram
#define gl_MapBuffer glMapBuffer
#define gl_MapBufferRange glMapBufferRange
#define gl_ProgramParameteri glProgramParameteri
#define gl_SamplerParameterf glSamplerParameterf
#define gl_SamplerParameteri glSamplerParameteri
#define gl_ShaderSource glShaderSource
#define gl_Uniform1i glUniform1i
#define gl_UnmapBuffer glUnmapBuffer
#define gl_UseProgramStages glUseProgramStages
#define gl_VertexAttribIPointer glVertexAttribIPointer
#define gl_VertexAttribPointer glVertexAttribPointer
#define gl_TexStorage2D glTexStorage2D
#define gl_BufferSubData glBufferSubData
#define gl_BindProgramPipeline glBindProgramPipeline
#define gl_DeleteProgramPipelines glDeleteProgramPipelines
#define gl_GenProgramPipelines glGenProgramPipelines
#define gl_GetProgramPipelineiv glGetProgramPipelineiv
#define gl_ValidateProgramPipeline glValidateProgramPipeline
#define gl_GetProgramPipelineInfoLog glGetProgramPipelineInfoLog
#define gl_UseProgram glUseProgram
#define gl_GetShaderInfoLog glGetShaderInfoLog
#define gl_ProgramUniform1i glProgramUniform1i
#define gl_GetUniformBlockIndex glGetUniformBlockIndex
#define gl_UniformBlockBinding glUniformBlockBinding
#define gl_GetUniformLocation glGetUniformLocation
#endif
namespace GLLoader {

View File

@ -287,8 +287,12 @@ static int _GSopen(void** dsp, char* title, int renderer, int threads = -1)
s_gs->m_wnd = new GSWndWGL();
else
s_gs->m_wnd = new GSWndDX();
#else
#ifdef ENABLE_GLES
wnd[0] = NULL;
#else
wnd[0] = new GSWndOGL();
#endif
wnd[1] = new GSWndEGL();
#endif
}

View File

@ -554,7 +554,11 @@ GLuint GSDeviceOGL::CompileGS(GSSelector sel)
std::string macro = format("#define GS_IIP %d\n", sel.iip)
+ format("#define GS_PRIM %d\n", sel.prim);
#ifdef ENABLE_GLES
return 0;
#else
return m_shader->Compile("tfx.glsl", "gs_main", GL_GEOMETRY_SHADER, tfx_glsl, macro);
#endif
}
GLuint GSDeviceOGL::CompilePS(PSSelector sel)
@ -667,11 +671,13 @@ void GSDeviceOGL::CopyRect(GSTexture* st, GSTexture* dt, const GSVector4i& r)
// uint32 dstName, enum dstTarget, int dstLevel, int dstX, int dstY, int dstZ,
// sizei width, sizei height, sizei depth);
if (GLLoader::found_GL_NV_copy_image) {
#ifndef ENABLE_GLES
gl_CopyImageSubDataNV( static_cast<GSTextureOGL*>(st)->GetID(), static_cast<GSTextureOGL*>(st)->GetTarget(),
0, r.x, r.y, 0,
static_cast<GSTextureOGL*>(dt)->GetID(), static_cast<GSTextureOGL*>(dt)->GetTarget(),
0, r.x, r.y, 0,
r.width(), r.height(), 1);
#endif
} else if (GLLoader::found_GL_ARB_copy_image) {
// Would need an update of GL definition. For the moment it isn't supported by driver anyway.
#if 0
@ -1152,6 +1158,7 @@ void GSDeviceOGL::CheckDebugLog()
void GSDeviceOGL::DebugOutputToFile(unsigned int source, unsigned int type, unsigned int id, unsigned int severity, const char* message)
{
#ifndef ENABLE_GLES
char debType[20], debSev[5];
static int sev_counter = 0;
@ -1190,6 +1197,7 @@ void GSDeviceOGL::DebugOutputToFile(unsigned int source, unsigned int type, unsi
fclose(f);
}
//if (sev_counter > 2) assert(0);
#endif
}
// (A - B) * C + D
@ -1219,8 +1227,13 @@ void GSDeviceOGL::DebugOutputToFile(unsigned int source, unsigned int type, unsi
#define D3DBLEND_BLENDFACTOR GL_CONSTANT_COLOR
#define D3DBLEND_INVBLENDFACTOR GL_ONE_MINUS_CONSTANT_COLOR
#ifdef ENABLE_GLES
#define D3DBLEND_SRCALPHA GL_SRC_ALPHA
#define D3DBLEND_INVSRCALPHA GL_ONE_MINUS_SRC_ALPHA
#else
#define D3DBLEND_SRCALPHA GL_SRC1_ALPHA
#define D3DBLEND_INVSRCALPHA GL_ONE_MINUS_SRC1_ALPHA
#endif
const GSDeviceOGL::D3D9Blend GSDeviceOGL::m_blendMapD3D9[3*3*3*3] =
{

View File

@ -123,12 +123,14 @@ public:
case GL_FUNC_REVERSE_SUBTRACT: return "REV SUB";
case GL_ONE: return "ONE";
case GL_ZERO: return "ZERO";
#ifndef ENABLE_GLES
case GL_SRC1_ALPHA: return "SRC1 ALPHA";
case GL_ONE_MINUS_SRC1_ALPHA: return "1 - SRC1 ALPHA";
#endif
case GL_SRC_ALPHA: return "SRC ALPHA";
case GL_ONE_MINUS_DST_ALPHA: return "1 - DST ALPHA";
case GL_DST_ALPHA: return "DST ALPHA";
case GL_DST_COLOR: return "DST COLOR";
case GL_ONE_MINUS_SRC1_ALPHA: return "1 - SRC1 ALPHA";
case GL_ONE_MINUS_SRC_ALPHA: return "1 - SRC ALPHA";
case GL_CONSTANT_COLOR: return "CST";
case GL_ONE_MINUS_CONSTANT_COLOR: return "1 - CST";

View File

@ -43,6 +43,10 @@ bool GSRendererOGL::CreateDevice(GSDevice* dev)
if(!GSRenderer::CreateDevice(dev))
return false;
#ifdef ENABLE_GLES
fprintf(stderr, "FIXME Creation of FBA dss/bs state is not yet implemented\n");
#endif
return true;
}
@ -417,14 +421,14 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour
// to only draw pixels which would cause the destination alpha test to fail in the future once.
// Unfortunately this also means only drawing those pixels at all, which is why this is a hack.
// The interaction with FBA in D3D9 is probably less than ideal.
if (UserHacks_AlphaStencil && DATE && dev->HasStencil() && om_bsel.wa && (!context->TEST.ATE || context->TEST.ATST == 1))
if (UserHacks_AlphaStencil && DATE && dev->HasStencil() && om_bsel.wa && (!context->TEST.ATE || context->TEST.ATST == ATST_ALWAYS))
{
if (!context->FBA.FBA)
{
if (context->TEST.DATM == 0)
ps_sel.atst = 5; // >=
ps_sel.atst = ATST_GEQUAL; // >=
else
ps_sel.atst = 2; // <
ps_sel.atst = ATST_LESS; // <
ps_cb.FogColor_AREF.a = (float)0x80;
}
if (!(context->FBA.FBA && context->TEST.DATM == 1))
@ -545,10 +549,10 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour
switch(context->TEST.AFAIL)
{
case 0: z = r = g = b = a = false; break; // none
case 1: z = false; break; // rgba
case 2: r = g = b = a = false; break; // z
case 3: z = a = false; break; // rgb
case AFAIL_KEEP: z = r = g = b = a = false; break; // none
case AFAIL_FB_ONLY: z = false; break; // rgba
case AFAIL_ZB_ONLY: r = g = b = a = false; break; // z
case AFAIL_RGB_ONLY: z = a = false; break; // rgb
default: __assume(0);
}
@ -584,3 +588,12 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour
if(om_dssel.fba) UpdateFBA(rt);
}
void GSRendererOGL::UpdateFBA(GSTexture* rt)
{
#ifdef ENABLE_GLES
#ifdef _DEBUG
fprintf(stderr, "FIXME UpdateFBA not yet implemented\n");
#endif
#endif
}

View File

@ -52,7 +52,7 @@ class GSRendererOGL : public GSRendererHW
bool CreateDevice(GSDevice* dev);
void UpdateFBA(GSTexture* rt) {}
void UpdateFBA(GSTexture* rt);
void DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* tex);
};

View File

@ -32,16 +32,20 @@ GSShaderOGL::GSShaderOGL(bool debug, bool sso, bool glsl420) :
m_glsl420(glsl420)
{
m_single_prog.clear();
#ifndef ENABLE_GLES
if (sso) {
gl_GenProgramPipelines(1, &m_pipeline);
gl_BindProgramPipeline(m_pipeline);
}
#endif
}
GSShaderOGL::~GSShaderOGL()
{
#ifndef ENABLE_GLES
if (m_sso)
gl_DeleteProgramPipelines(1, &m_pipeline);
#endif
for (auto it = m_single_prog.begin(); it != m_single_prog.end() ; it++) gl_DeleteProgram(it->second);
m_single_prog.clear();
@ -52,8 +56,10 @@ void GSShaderOGL::VS(GLuint s)
if (m_vs != s)
{
m_vs = s;
#ifndef ENABLE_GLES
if (m_sso)
gl_UseProgramStages(m_pipeline, GL_VERTEX_SHADER_BIT, s);
#endif
}
}
@ -62,8 +68,10 @@ void GSShaderOGL::PS(GLuint s)
if (m_ps != s)
{
m_ps = s;
#ifndef ENABLE_GLES
if (m_sso)
gl_UseProgramStages(m_pipeline, GL_FRAGMENT_SHADER_BIT, s);
#endif
}
}
@ -72,8 +80,10 @@ void GSShaderOGL::GS(GLuint s)
if (m_gs != s)
{
m_gs = s;
#ifndef ENABLE_GLES
if (m_sso)
gl_UseProgramStages(m_pipeline, GL_GEOMETRY_SHADER_BIT, s);
#endif
}
}
@ -91,7 +101,9 @@ void GSShaderOGL::SetSamplerBinding(GLuint prog, GLchar* name, GLuint binding)
GLint loc = gl_GetUniformLocation(prog, name);
if (loc != -1) {
if (m_sso) {
#ifndef ENABLE_GLES
gl_ProgramUniform1i(prog, loc, binding);
#endif
} else {
gl_Uniform1i(loc, binding);
}
@ -173,6 +185,7 @@ bool GSShaderOGL::ValidateProgram(GLuint p)
bool GSShaderOGL::ValidatePipeline(GLuint p)
{
#ifndef ENABLE_GLES
if (!m_debug_shader) return true;
// FIXME: might be mandatory to validate the pipeline
@ -192,6 +205,8 @@ bool GSShaderOGL::ValidatePipeline(GLuint p)
}
fprintf(stderr, "\n");
#endif
return false;
}
@ -282,9 +297,11 @@ std::string GSShaderOGL::GenGlslHeader(const std::string& entry, GLenum type, co
case GL_VERTEX_SHADER:
header += "#define VERTEX_SHADER 1\n";
break;
#ifndef ENABLE_GLES
case GL_GEOMETRY_SHADER:
header += "#define GEOMETRY_SHADER 1\n";
break;
#endif
case GL_FRAGMENT_SHADER:
header += "#define FRAGMENT_SHADER 1\n";
break;
@ -303,10 +320,11 @@ GLuint GSShaderOGL::Compile(const std::string& glsl_file, const std::string& ent
{
GLuint program = 0;
// Not supported
#ifndef ENABLE_GLES
if (type == GL_GEOMETRY_SHADER && !GLLoader::found_geometry_shader) {
return program;
}
#endif
// Note it is better to separate header and source file to have the good line number
// in the glsl compiler report
@ -321,14 +339,15 @@ GLuint GSShaderOGL::Compile(const std::string& glsl_file, const std::string& ent
sources[1] = '\0';
if (m_sso) {
#ifndef ENABLE_GLES
#if 0
// Could be useful one day
const GLchar* ShaderSource[1];
ShaderSource[0] = header.append(glsl_h_code).c_str();
program = gl_CreateShaderProgramv(type, 1, &ShaderSource[0]);
#else
program = gl_CreateShaderProgramv(type, 2, sources);
#endif
#endif
} else {
program = gl_CreateShader(type);
gl_ShaderSource(program, 2, sources, NULL);

View File

@ -24,6 +24,7 @@
void GSWndGL::PopulateGlFunction()
{
#ifndef ENABLE_GLES
*(void**)&(gl_ActiveTexture) = GetProcAddress("glActiveTexture");
*(void**)&(gl_BlendColor) = GetProcAddress("glBlendColor");
*(void**)&(gl_AttachShader) = GetProcAddress("glAttachShader");
@ -99,4 +100,5 @@ void GSWndGL::PopulateGlFunction()
*(void**)&(gl_GetUniformBlockIndex) = GetProcAddress("glGetUniformBlockIndex");
*(void**)&(gl_UniformBlockBinding) = GetProcAddress("glUniformBlockBinding");
*(void**)&(gl_GetUniformLocation) = GetProcAddress("glGetUniformLocation");
#endif
}

View File

@ -22,7 +22,7 @@
#include "stdafx.h"
#include "GSWndOGL.h"
#ifdef _LINUX
#if defined(_LINUX) && !defined(ENABLE_GLES)
GSWndOGL::GSWndOGL()
: m_NativeWindow(0), m_NativeDisplay(NULL), m_swapinterval(NULL)
{

View File

@ -21,7 +21,7 @@
#include "GSWnd.h"
#ifdef _LINUX
#if defined(_LINUX) && !defined(ENABLE_GLES)
#include <X11/Xlib.h>
#include <GL/glx.h>

View File

@ -349,8 +349,12 @@ layout(location = 2) in vec4 SHADERc;
#endif
// Same buffer but 2 colors for dual source blending
#if GL_ES
layout(location = 0) out vec4 SV_Target0;
#else
layout(location = 0, index = 0) out vec4 SV_Target0;
layout(location = 0, index = 1) out vec4 SV_Target1;
#endif
#ifdef DISABLE_GL42
uniform sampler2D TextureSampler;
@ -724,6 +728,13 @@ void ps_main()
{
vec4 c = ps_color();
#if GL_ES
c.a *= 2.0;
SV_Target0 = c;
#else
float alpha = c.a * 2.0;
if(PS_AOUT != 0) // 16 bit output
@ -739,5 +750,8 @@ void ps_main()
SV_Target0 = c;
SV_Target1 = vec4(alpha, alpha, alpha, alpha);
#endif
}
#endif

View File

@ -186,8 +186,13 @@ using namespace std;
//#include <ext/hash_map>
//#include <ext/hash_set>
#ifdef ENABLE_GLES
#include <GLES3/gl3.h>
#include <GLES3/gl3ext.h>
#else
#include <GL/gl.h>
#include <GL/glext.h>
#endif
#include "GLLoader.h"
//using namespace __gnu_cxx;