Cocoa Port:

- Bring back glVertexAttribPointer() to the OpenGL blitter.
- Disable shaders on PowerPC builds since they don't seem to work there.
- Since OS X v10.5 is required, assume the availability of GL_APPLE_vertex_array_object and GL_ARB_vertex_buffer_object. Remove the associated code paths to reduce code complexity.
This commit is contained in:
rogerman 2013-02-07 22:18:21 +00:00
parent 854c15de87
commit 78c13cc41d
2 changed files with 87 additions and 139 deletions

View File

@ -123,9 +123,7 @@
{ {
CGLContextObj cglDisplayContext; CGLContextObj cglDisplayContext;
BOOL isVBOSupported; BOOL isShaderSupported;
BOOL isShadersSupported;
BOOL isVAOSupported;
DisplayViewDelegate *dispViewDelegate; DisplayViewDelegate *dispViewDelegate;
NSInteger lastDisplayMode; NSInteger lastDisplayMode;

View File

@ -32,6 +32,9 @@
// VERTEX SHADER FOR DISPLAY OUTPUT // VERTEX SHADER FOR DISPLAY OUTPUT
const char *vShader_100 = {"\ const char *vShader_100 = {"\
attribute vec2 inPosition; \n\
attribute vec2 inTexCoord0; \n\
\n\
uniform vec2 viewSize; \n\ uniform vec2 viewSize; \n\
uniform float scalar; \n\ uniform float scalar; \n\
uniform float angleDegrees; \n\ uniform float angleDegrees; \n\
@ -51,8 +54,8 @@ const char *vShader_100 = {"\
mat2 scale = mat2( vec2(scalar, 0.0), \n\ mat2 scale = mat2( vec2(scalar, 0.0), \n\
vec2( 0.0, scalar)); \n\ vec2( 0.0, scalar)); \n\
\n\ \n\
vtxTexCoord = gl_MultiTexCoord0; \n\ vtxTexCoord = inTexCoord0; \n\
gl_Position = vec4(projection * rotation * scale * gl_Vertex, 1.0, 1.0); \n\ gl_Position = vec4(projection * rotation * scale * inPosition, 1.0, 1.0); \n\
} \n\ } \n\
"}; "};
@ -1002,19 +1005,12 @@ enum OGLVertexAttributeID
glDeleteTextures(1, &displayTexID); glDeleteTextures(1, &displayTexID);
if (isVAOSupported) glDeleteVertexArraysAPPLE(1, &vaoMainStatesID);
{ glDeleteBuffersARB(1, &vboVertexID);
glDeleteVertexArraysAPPLE(1, &vaoMainStatesID); glDeleteBuffersARB(1, &vboTexCoordID);
} glDeleteBuffersARB(1, &vboElementID);
if (isVBOSupported) if (isShaderSupported)
{
glDeleteBuffersARB(1, &vboVertexID);
glDeleteBuffersARB(1, &vboTexCoordID);
glDeleteBuffersARB(1, &vboElementID);
}
if (isShadersSupported)
{ {
glUseProgram(0); glUseProgram(0);
@ -1082,31 +1078,16 @@ enum OGLVertexAttributeID
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
// Set up VBOs // Set up shaders (but disable on PowerPC, since it doesn't seem to work there)
isVBOSupported = gluCheckExtension((const GLubyte *)"GL_ARB_vertex_buffer_object", glExtString); #if defined(__i386__) || defined(__x86_64__)
if (isVBOSupported) isShaderSupported = (gluCheckExtension((const GLubyte *)"GL_ARB_shader_objects", glExtString) &&
{
glGenBuffersARB(1, &vboVertexID);
glGenBuffersARB(1, &vboTexCoordID);
glGenBuffersARB(1, &vboElementID);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLint) * (2 * 8), vtxBuffer, GL_STATIC_DRAW_ARB);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * (2 * 8), texCoordBuffer, GL_STATIC_DRAW_ARB);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vboElementID);
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(GLubyte) * 12, vtxIndexBuffer, GL_STATIC_DRAW_ARB);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
}
// Set up shaders
isShadersSupported = (gluCheckExtension((const GLubyte *)"GL_ARB_shader_objects", glExtString) &&
gluCheckExtension((const GLubyte *)"GL_ARB_vertex_shader", glExtString) && gluCheckExtension((const GLubyte *)"GL_ARB_vertex_shader", glExtString) &&
gluCheckExtension((const GLubyte *)"GL_ARB_fragment_shader", glExtString) && gluCheckExtension((const GLubyte *)"GL_ARB_fragment_shader", glExtString) &&
gluCheckExtension((const GLubyte *)"GL_ARB_vertex_program", glExtString) ); gluCheckExtension((const GLubyte *)"GL_ARB_vertex_program", glExtString) );
if (isShadersSupported) #else
isShaderSupported = false;
#endif
if (isShaderSupported)
{ {
GLint shaderStatus = SetupShaders(&shaderProgram, &vertexShaderID, &fragmentShaderID, vShader_100, fShader_100); GLint shaderStatus = SetupShaders(&shaderProgram, &vertexShaderID, &fragmentShaderID, vShader_100, fShader_100);
if (shaderStatus == GL_TRUE) if (shaderStatus == GL_TRUE)
@ -1123,32 +1104,54 @@ enum OGLVertexAttributeID
} }
else else
{ {
isShadersSupported = false; isShaderSupported = false;
} }
} }
// Set up VBOs
glGenBuffersARB(1, &vboVertexID);
glGenBuffersARB(1, &vboTexCoordID);
glGenBuffersARB(1, &vboElementID);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLint) * (2 * 8), vtxBuffer, GL_STATIC_DRAW_ARB);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * (2 * 8), texCoordBuffer, GL_STATIC_DRAW_ARB);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vboElementID);
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(GLubyte) * 12, vtxIndexBuffer, GL_STATIC_DRAW_ARB);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
// Set up VAO // Set up VAO
isVAOSupported = ( isVBOSupported && glGenVertexArraysAPPLE(1, &vaoMainStatesID);
isShadersSupported && glBindVertexArrayAPPLE(vaoMainStatesID);
gluCheckExtension((const GLubyte *)"GL_APPLE_vertex_array_object", glExtString) );
if (isVAOSupported) if (isShaderSupported)
{ {
glGenVertexArraysAPPLE(1, &vaoMainStatesID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID);
glBindVertexArrayAPPLE(vaoMainStatesID); glVertexAttribPointer(OGLVertexAttributeID_Position, 2, GL_INT, GL_FALSE, 0, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID);
glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vboElementID);
glEnableVertexAttribArray(OGLVertexAttributeID_Position);
glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0);
}
else
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID);
glVertexPointer(2, GL_INT, 0, 0); glVertexPointer(2, GL_INT, 0, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID);
glTexCoordPointer(2, GL_FLOAT, 0, 0); glTexCoordPointer(2, GL_FLOAT, 0, 0);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vboElementID); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vboElementID);
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindVertexArrayAPPLE(0);
} }
glBindVertexArrayAPPLE(0);
// Render State Setup (common to both shaders and fixed-function pipeline) // Render State Setup (common to both shaders and fixed-function pipeline)
glDisable(GL_BLEND); glDisable(GL_BLEND);
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
@ -1156,7 +1159,7 @@ enum OGLVertexAttributeID
glDisable(GL_STENCIL_TEST); glDisable(GL_STENCIL_TEST);
// Set up fixed-function pipeline render states. // Set up fixed-function pipeline render states.
if (!isShadersSupported) if (!isShaderSupported)
{ {
glDisable(GL_ALPHA_TEST); glDisable(GL_ALPHA_TEST);
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
@ -1190,74 +1193,30 @@ enum OGLVertexAttributeID
- (void) renderDisplayUsingDisplayMode:(const NSInteger)displayModeID - (void) renderDisplayUsingDisplayMode:(const NSInteger)displayModeID
{ {
// Assign vertex attributes based on which OpenGL features we have. // Enable vertex attributes
if (isVAOSupported) glBindVertexArrayAPPLE(vaoMainStatesID);
{
glBindVertexArrayAPPLE(vaoMainStatesID);
}
else
{
if (isVBOSupported)
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID);
glVertexPointer(2, GL_INT, 0, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vboElementID);
}
else
{
glVertexPointer(2, GL_INT, 0, vtxBuffer);
glTexCoordPointer(2, GL_FLOAT, 0, texCoordBuffer);
}
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}
// Perform the render. // Perform the render
if (lastDisplayMode != displayModeID) if (lastDisplayMode != displayModeID)
{ {
lastDisplayMode = displayModeID; lastDisplayMode = displayModeID;
[self updateDisplayVerticesUsingDisplayMode:displayModeID orientation:currentDisplayOrientation]; [self updateDisplayVerticesUsingDisplayMode:displayModeID orientation:currentDisplayOrientation];
if (isVBOSupported) glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID);
{ glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLint) * (2 * 8), vtxBuffer + vtxBufferOffset);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLint) * (2 * 8), vtxBuffer + vtxBufferOffset);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
}
} }
const GLsizei vtxElementCount = (displayModeID == DS_DISPLAY_TYPE_COMBO) ? 12 : 6; const GLsizei vtxElementCount = (displayModeID == DS_DISPLAY_TYPE_COMBO) ? 12 : 6;
GLubyte *elementPointer = isVBOSupported ? 0 : vtxIndexBuffer; const GLubyte *elementPointer = !(displayModeID == DS_DISPLAY_TYPE_TOUCH) ? 0 : (GLubyte *)(vtxElementCount * sizeof(GLubyte));
if (displayModeID == DS_DISPLAY_TYPE_TOUCH)
{
elementPointer += vtxElementCount;
}
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, displayTexID); glBindTexture(GL_TEXTURE_2D, displayTexID);
glDrawElements(GL_TRIANGLES, vtxElementCount, GL_UNSIGNED_BYTE, elementPointer); glDrawElements(GL_TRIANGLES, vtxElementCount, GL_UNSIGNED_BYTE, elementPointer);
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
// Disable vertex attributes. // Disable vertex attributes
if (isVAOSupported) glBindVertexArrayAPPLE(0);
{
glBindVertexArrayAPPLE(0);
}
else
{
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
if (isVBOSupported)
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
}
}
} }
- (void) updateDisplayVerticesUsingDisplayMode:(const NSInteger)displayModeID orientation:(const NSInteger)displayOrientationID - (void) updateDisplayVerticesUsingDisplayMode:(const NSInteger)displayModeID orientation:(const NSInteger)displayOrientationID
@ -1448,7 +1407,7 @@ enum OGLVertexAttributeID
glViewport(0, 0, rect.size.width, rect.size.height); glViewport(0, 0, rect.size.width, rect.size.height);
if (isShadersSupported) if (isShaderSupported)
{ {
glUniform2f(uniformViewSize, rect.size.width, rect.size.height); glUniform2f(uniformViewSize, rect.size.width, rect.size.height);
} }
@ -1470,7 +1429,7 @@ enum OGLVertexAttributeID
CGLLockContext(cglDisplayContext); CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext);
if (isShadersSupported) if (isShaderSupported)
{ {
glUniform1f(uniformAngleDegrees, angleDegrees); glUniform1f(uniformAngleDegrees, angleDegrees);
glUniform1f(uniformScalar, s); glUniform1f(uniformScalar, s);
@ -1502,17 +1461,14 @@ enum OGLVertexAttributeID
lastDisplayMode = displayModeID; lastDisplayMode = displayModeID;
[self updateDisplayVerticesUsingDisplayMode:displayModeID orientation:currentDisplayOrientation]; [self updateDisplayVerticesUsingDisplayMode:displayModeID orientation:currentDisplayOrientation];
if (isVBOSupported) CGLLockContext(cglDisplayContext);
{ CGLSetCurrentContext(cglDisplayContext);
CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext); glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLint) * (2 * 8), vtxBuffer + vtxBufferOffset);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLint) * (2 * 8), vtxBuffer + vtxBufferOffset);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); CGLUnlockContext(cglDisplayContext);
CGLUnlockContext(cglDisplayContext);
}
} }
- (void)doBilinearOutputChanged:(BOOL)useBilinear - (void)doBilinearOutputChanged:(BOOL)useBilinear
@ -1534,17 +1490,14 @@ enum OGLVertexAttributeID
currentDisplayOrientation = displayOrientationID; currentDisplayOrientation = displayOrientationID;
[self updateDisplayVerticesUsingDisplayMode:lastDisplayMode orientation:displayOrientationID]; [self updateDisplayVerticesUsingDisplayMode:lastDisplayMode orientation:displayOrientationID];
if (isVBOSupported) CGLLockContext(cglDisplayContext);
{ CGLSetCurrentContext(cglDisplayContext);
CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext); glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLint) * (2 * 8), vtxBuffer + vtxBufferOffset);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLint) * (2 * 8), vtxBuffer + vtxBufferOffset);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); CGLUnlockContext(cglDisplayContext);
CGLUnlockContext(cglDisplayContext);
}
} }
- (void) doDisplayOrderChanged:(NSInteger)displayOrderID - (void) doDisplayOrderChanged:(NSInteger)displayOrderID
@ -1561,12 +1514,9 @@ enum OGLVertexAttributeID
CGLLockContext(cglDisplayContext); CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext);
if (isVBOSupported) glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID);
{ glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLint) * (2 * 8), vtxBuffer + vtxBufferOffset);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLint) * (2 * 8), vtxBuffer + vtxBufferOffset);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
}
if (lastDisplayMode == DS_DISPLAY_TYPE_COMBO) if (lastDisplayMode == DS_DISPLAY_TYPE_COMBO)
{ {
@ -1628,12 +1578,9 @@ enum OGLVertexAttributeID
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)potW, (GLsizei)potH, 0, GL_BGRA, glTexPixelFormat, glTexBack); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)potW, (GLsizei)potH, 0, GL_BGRA, glTexPixelFormat, glTexBack);
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
if (isVBOSupported) glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID);
{ glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLfloat) * (2 * 8), texCoordBuffer);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLfloat) * (2 * 8), texCoordBuffer);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
}
CGLUnlockContext(cglDisplayContext); CGLUnlockContext(cglDisplayContext);
} }
@ -1692,6 +1639,9 @@ GLint SetupShaders(GLuint *programID, GLuint *vertShaderID, GLuint *fragShaderID
glAttachShader(*programID, *vertShaderID); glAttachShader(*programID, *vertShaderID);
glAttachShader(*programID, *fragShaderID); glAttachShader(*programID, *fragShaderID);
glBindAttribLocation(*programID, OGLVertexAttributeID_Position, "inPosition");
glBindAttribLocation(*programID, OGLVertexAttributeID_TexCoord0, "inTexCoord0");
glLinkProgram(*programID); glLinkProgram(*programID);
glGetProgramiv(*programID, GL_LINK_STATUS, &shaderStatus); glGetProgramiv(*programID, GL_LINK_STATUS, &shaderStatus);
if (shaderStatus == GL_FALSE) if (shaderStatus == GL_FALSE)