summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends
diff options
context:
space:
mode:
authorRyan Houdek <Sonicadvance1@gmail.com>2013-12-31 15:41:50 -0600
committerRyan Houdek <Sonicadvance1@gmail.com>2013-12-31 15:41:50 -0600
commit8d8b0fc884367bc4d433d698a790ef5badee6957 (patch)
treea15158d7f38eea2f63432da4f75615ad5919571c /Source/Core/VideoBackends
parent0b31fc8f52444964398b4d0253793c22e7f042b3 (diff)
parent6d63db96e962586b13ad343e26182f9e7be7cc2b (diff)
Merge branch 'master' into buffer_storage
Conflicts: Source/Core/VideoBackends/OGL/Src/Render.cpp Source/Core/VideoCommon/Src/DriverDetails.cpp Source/Core/VideoCommon/Src/DriverDetails.h
Diffstat (limited to 'Source/Core/VideoBackends')
-rw-r--r--Source/Core/VideoBackends/D3D/Src/Render.cpp1
-rw-r--r--Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp22
-rw-r--r--Source/Core/VideoBackends/OGL/Src/GLFunctions.h4
-rw-r--r--Source/Core/VideoBackends/OGL/Src/Render.cpp23
-rw-r--r--Source/Core/VideoBackends/OGL/Src/StreamBuffer.cpp4
-rw-r--r--Source/Core/VideoBackends/Software/Src/Rasterizer.cpp4
6 files changed, 51 insertions, 7 deletions
diff --git a/Source/Core/VideoBackends/D3D/Src/Render.cpp b/Source/Core/VideoBackends/D3D/Src/Render.cpp
index a84010c70f..5d2df67e5f 100644
--- a/Source/Core/VideoBackends/D3D/Src/Render.cpp
+++ b/Source/Core/VideoBackends/D3D/Src/Render.cpp
@@ -1167,6 +1167,7 @@ void Renderer::SetGenerationMode()
};
// rastdc.FrontCounterClockwise must be false for this to work
+ // TODO: GX_CULL_ALL not supported, yet!
gx_state.rastdc.CullMode = d3dCullModes[bpmem.genMode.cullmode];
}
diff --git a/Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp b/Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp
index c91908ea11..505326b1ea 100644
--- a/Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp
+++ b/Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp
@@ -5,7 +5,9 @@
#include "DriverDetails.h"
#include "GLFunctions.h"
#include "Log.h"
+
#include <dlfcn.h>
+#include <unordered_map>
#ifdef USE_GLES3
PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
@@ -13,6 +15,7 @@ PFNGLUNMAPBUFFERPROC glUnmapBuffer;
PFNGLBINDBUFFERRANGEPROC glBindBufferRange;
PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
+PFNGLGETSTRINGIPROC glGetStringi;
PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
@@ -49,6 +52,8 @@ PFNGLGENQUERIESPROC glGenQueries;
namespace GLFunc
{
void *self;
+ std::unordered_map<std::string, bool> _extensions;
+
void LoadFunction(const char *name, void **func)
{
#ifdef USE_GLES3
@@ -67,10 +72,27 @@ namespace GLFunc
#endif
}
+ bool SupportsExt(std::string ext)
+ {
+ return _extensions.find(ext) != _extensions.end();
+ }
+
+ void InitExtensions()
+ {
+ GLint NumExtension = 0;
+ glGetIntegerv(GL_NUM_EXTENSIONS, &NumExtension);
+ for (GLint i = 0; i < NumExtension; ++i)
+ _extensions[std::string((const char*)glGetStringi(GL_EXTENSIONS, i))] = true;
+ }
+
void Init()
{
self = dlopen(NULL, RTLD_LAZY);
+ LoadFunction("glGetStringi", (void**)&glGetStringi);
+
+ InitExtensions();
+
LoadFunction("glUnmapBuffer", (void**)&glUnmapBuffer);
LoadFunction("glBeginQuery", (void**)&glBeginQuery);
LoadFunction("glEndQuery", (void**)&glEndQuery);
diff --git a/Source/Core/VideoBackends/OGL/Src/GLFunctions.h b/Source/Core/VideoBackends/OGL/Src/GLFunctions.h
index cbfde1276c..7cdd5476ba 100644
--- a/Source/Core/VideoBackends/OGL/Src/GLFunctions.h
+++ b/Source/Core/VideoBackends/OGL/Src/GLFunctions.h
@@ -10,8 +10,10 @@ typedef GLvoid* (*PFNGLMAPBUFFERPROC) (GLenum target, GLenum access);
typedef GLvoid* (*PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
typedef void (*PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
typedef GLboolean (*PFNGLUNMAPBUFFERPROC) (GLenum target);
+typedef GLubyte* (*PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
typedef void (*PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+
// VAOS
typedef void (*PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays);
typedef void (*PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays);
@@ -63,6 +65,7 @@ extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
extern PFNGLBINDBUFFERRANGEPROC glBindBufferRange;
extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
+extern PFNGLGETSTRINGIPROC glGetStringi;
extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
@@ -95,5 +98,6 @@ extern PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding;
namespace GLFunc
{
void Init();
+ bool SupportsExt(std::string ext);
}
#endif
diff --git a/Source/Core/VideoBackends/OGL/Src/Render.cpp b/Source/Core/VideoBackends/OGL/Src/Render.cpp
index b2b5687047..8a7c499192 100644
--- a/Source/Core/VideoBackends/OGL/Src/Render.cpp
+++ b/Source/Core/VideoBackends/OGL/Src/Render.cpp
@@ -260,6 +260,7 @@ void InitDriverInfo()
DriverDetails::Vendor vendor = DriverDetails::VENDOR_UNKNOWN;
DriverDetails::Driver driver = DriverDetails::DRIVER_UNKNOWN;
double version = 0.0;
+ u32 family = 0;
// Get the vendor first
if (svendor == "NVIDIA Corporation" && srenderer != "NVIDIA Tegra")
@@ -321,11 +322,23 @@ void InitDriverInfo()
version = 100*major + 10*minor + release;
}
break;
+ case DriverDetails::VENDOR_INTEL: // Happens in OS X
+ sscanf(g_ogl_config.gl_renderer, "Intel HD Graphics %d", &family);
+ /*
+ int glmajor = 0;
+ int glminor = 0;
+ int major = 0;
+ int minor = 0;
+ int release = 0;
+ sscanf(g_ogl_config.gl_version, "%d.%d INTEL-%d.%d.%d", &glmajor, &glminor, &major, &minor, &release);
+ version = 10000*major + 1000*minor + release;
+ */
+ break;
// We don't care about these
default:
break;
}
- DriverDetails::Init(vendor, driver, version);
+ DriverDetails::Init(vendor, driver, version, family);
}
// Init functions
@@ -359,11 +372,7 @@ Renderer::Renderer()
g_Config.backend_info.bSupportsPrimitiveRestart = true;
g_Config.backend_info.bSupportsEarlyZ = false;
-#ifdef ANDROID
- g_ogl_config.bSupportsGLSLCache = false;
-#else
g_ogl_config.bSupportsGLSLCache = true;
-#endif
g_ogl_config.bSupportsGLPinnedMemory = false;
g_ogl_config.bSupportsGLSync = true;
g_ogl_config.bSupportsGLBaseVertex = false;
@@ -470,7 +479,8 @@ Renderer::Renderer()
g_Config.backend_info.bSupportsDualSourceBlend = TO_BOOL(GLEW_ARB_blend_func_extended);
g_Config.backend_info.bSupportsGLSLUBO = TO_BOOL(GLEW_ARB_uniform_buffer_object);
- g_Config.backend_info.bSupportsPrimitiveRestart = TO_BOOL(GLEW_VERSION_3_1) || TO_BOOL(GLEW_NV_primitive_restart);
+ g_Config.backend_info.bSupportsPrimitiveRestart = !DriverDetails::HasBug(DriverDetails::BUG_PRIMITIVERESTART) &&
+ (TO_BOOL(GLEW_VERSION_3_1) || TO_BOOL(GLEW_NV_primitive_restart));
g_Config.backend_info.bSupportsEarlyZ = TO_BOOL(GLEW_ARB_shader_image_load_store);
g_ogl_config.bSupportsGLSLCache = TO_BOOL(GLEW_ARB_get_program_binary);
@@ -1680,6 +1690,7 @@ void Renderer::SetGenerationMode()
// none, ccw, cw, ccw
if (bpmem.genMode.cullmode > 0)
{
+ // TODO: GX_CULL_ALL not supported, yet!
glEnable(GL_CULL_FACE);
glFrontFace(bpmem.genMode.cullmode == 2 ? GL_CCW : GL_CW);
}
diff --git a/Source/Core/VideoBackends/OGL/Src/StreamBuffer.cpp b/Source/Core/VideoBackends/OGL/Src/StreamBuffer.cpp
index 95e8a8e72b..c80dc6e703 100644
--- a/Source/Core/VideoBackends/OGL/Src/StreamBuffer.cpp
+++ b/Source/Core/VideoBackends/OGL/Src/StreamBuffer.cpp
@@ -44,7 +44,9 @@ StreamBuffer::StreamBuffer(u32 type, size_t size, StreamType uploadType)
m_uploadtype = BUFFERDATA;
else if(g_ogl_config.bSupportsGLSync && g_ActiveConfig.bHackedBufferUpload && (m_uploadtype & MAP_AND_RISK))
m_uploadtype = MAP_AND_RISK;
- else if(g_ogl_config.bSupportsGLSync && g_ogl_config.bSupportsGLPinnedMemory && (m_uploadtype & PINNED_MEMORY))
+ else if(g_ogl_config.bSupportsGLSync && g_ogl_config.bSupportsGLPinnedMemory &&
+ !(DriverDetails::HasBug(DriverDetails::BUG_BROKENPINNEDMEMORY) && type == GL_ELEMENT_ARRAY_BUFFER) &&
+ (m_uploadtype & PINNED_MEMORY))
m_uploadtype = PINNED_MEMORY;
else if(nvidia && (m_uploadtype & BUFFERSUBDATA))
m_uploadtype = BUFFERSUBDATA;
diff --git a/Source/Core/VideoBackends/Software/Src/Rasterizer.cpp b/Source/Core/VideoBackends/Software/Src/Rasterizer.cpp
index fa10ac38af..377a437c64 100644
--- a/Source/Core/VideoBackends/Software/Src/Rasterizer.cpp
+++ b/Source/Core/VideoBackends/Software/Src/Rasterizer.cpp
@@ -385,6 +385,10 @@ void DrawTriangleFrontFace(OutputVertexData *v0, OutputVertexData *v1, OutputVer
float w[3] = { 1.0f / v0->projectedPosition.w, 1.0f / v1->projectedPosition.w, 1.0f / v2->projectedPosition.w };
InitSlope(&WSlope, w[0], w[1], w[2], fltdx31, fltdx12, fltdy12, fltdy31);
+ // TODO: The zfreeze emulation is not quite correct, yet!
+ // Many things might prevent us from reaching this line (culling, clipping, scissoring).
+ // However, the zslope is always guaranteed to be calculated unless all vertices are trivially rejected during clipping!
+ // We're currently sloppy at this since we abort early if any of the culling/clipping/scissoring tests fail.
if (!bpmem.genMode.zfreeze || !g_SWVideoConfig.bZFreeze)
InitSlope(&ZSlope, v0->screenPosition[2], v1->screenPosition[2], v2->screenPosition[2], fltdx31, fltdx12, fltdy12, fltdy31);