Cocoa Port:

- Do some random code cleanup.
This commit is contained in:
rogerman 2013-02-11 20:57:16 +00:00
parent f923c7a493
commit 0fd5648ab6
9 changed files with 190 additions and 174 deletions

View File

@ -16,12 +16,14 @@
along with the this software. If not, see <http://www.gnu.org/licenses/>. along with the this software. If not, see <http://www.gnu.org/licenses/>.
*/ */
#import <Cocoa/Cocoa.h> #import <Foundation/Foundation.h>
#include <pthread.h> #include <pthread.h>
#include <libkern/OSAtomic.h> #include <libkern/OSAtomic.h>
#import "cocoa_util.h" #import "cocoa_util.h"
@class NSImage;
@class NSBitmapImageRep;
typedef struct typedef struct
{ {

View File

@ -28,14 +28,15 @@
#include "../SPU.h" #include "../SPU.h"
#include "../metaspu/metaspu.h" #include "../metaspu/metaspu.h"
#include <OpenGL/OpenGL.h>
#ifdef MAC_OS_X_VERSION_10_7 #ifdef MAC_OS_X_VERSION_10_7
#include "../OGLRender_3_2.h" #include "../OGLRender_3_2.h"
#else #else
#include "../OGLRender.h" #include "../OGLRender.h"
#endif #endif
#import <Cocoa/Cocoa.h>
#include <OpenGL/OpenGL.h>
#undef BOOL #undef BOOL
GPU3DInterface *core3DList[] = { GPU3DInterface *core3DList[] = {
@ -1320,7 +1321,7 @@ GPU3DInterface *core3DList[] = {
} }
uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData]; uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData];
RGBA5551ToRGBA8888Buffer((const uint16_t *)[self.frameData bytes], bitmapData, (w * h)); RGB555ToRGBA8888Buffer((const uint16_t *)[self.frameData bytes], bitmapData, (w * h));
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
uint32_t *bitmapDataEnd = bitmapData + (w * h); uint32_t *bitmapDataEnd = bitmapData + (w * h);
@ -1622,7 +1623,7 @@ GPU3DInterface *core3DList[] = {
} }
else else
{ {
RGBA5551ToRGBA8888Buffer((const uint16_t *)[mainData bytes], (uint32_t *)[vf srcBufferPtr], [mainData length] / sizeof(UInt16)); RGB555ToRGBA8888Buffer((const uint16_t *)[mainData bytes], (uint32_t *)[vf srcBufferPtr], [mainData length] / sizeof(UInt16));
const UInt32 *vfDestBuffer = [vf runFilter]; const UInt32 *vfDestBuffer = [vf runFilter];
[videoDelegate doProcessVideoFrame:vfDestBuffer displayMode:displayModeID width:destWidth height:destHeight]; [videoDelegate doProcessVideoFrame:vfDestBuffer displayMode:displayModeID width:destWidth height:destHeight];
} }
@ -1973,6 +1974,7 @@ void DestroyOpenGLRenderer()
CGLReleasePBuffer(OSXOpenGLRendererPBuffer); CGLReleasePBuffer(OSXOpenGLRendererPBuffer);
CGLReleaseContext(OSXOpenGLRendererContext); CGLReleaseContext(OSXOpenGLRendererContext);
OSXOpenGLRendererContext = NULL; OSXOpenGLRendererContext = NULL;
OSXOpenGLRendererPBuffer = NULL;
} }
void RequestOpenGLRenderer_3_2(bool request_3_2) void RequestOpenGLRenderer_3_2(bool request_3_2)

View File

@ -571,14 +571,14 @@ void RomIconToRGBA8888(uint32_t *bitmapData)
iconClutPtr = (uint16_t *)&MMU.CART_ROM[iconOffset + 0x220] + 1; iconClutPtr = (uint16_t *)&MMU.CART_ROM[iconOffset + 0x220] + 1;
iconPixPtr = (uint32_t *)&MMU.CART_ROM[iconOffset + 0x20]; iconPixPtr = (uint32_t *)&MMU.CART_ROM[iconOffset + 0x20];
// Setup the 4-bit color CLUT. // Setup the 4-bit CLUT.
// //
// The actual color values are stored with the ROM icon data in RGBA5551 format. // The actual color values are stored with the ROM icon data in RGB555 format.
// We convert these color values and store them in the CLUT as RGBA8888 values. // We convert these color values and store them in the CLUT as RGBA8888 values.
// //
// The first entry always represents the alpha, so we can just ignore it. // The first entry always represents the alpha, so we can just ignore it.
clut[0] = 0x00000000; clut[0] = 0x00000000;
RGBA5551ToRGBA8888Buffer(iconClutPtr, &clut[1], 15); RGB555ToRGBA8888Buffer(iconClutPtr, &clut[1], 15);
// Load the image from the icon pixel data. // Load the image from the icon pixel data.
// //

View File

@ -16,7 +16,7 @@
along with the this software. If not, see <http://www.gnu.org/licenses/>. along with the this software. If not, see <http://www.gnu.org/licenses/>.
*/ */
#import <Cocoa/Cocoa.h> #import <Foundation/Foundation.h>
#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
#include "macosx_10_4_compat.h" #include "macosx_10_4_compat.h"
@ -93,10 +93,10 @@ extern "C"
{ {
#endif #endif
uint32_t RGBA5551ToRGBA8888(const uint16_t color16); uint32_t RGB555ToRGBA8888(const uint16_t color16);
uint32_t RGBA8888ToRGB888(const uint32_t color24); uint32_t RGBA8888ForceOpaque(const uint32_t color32);
void RGBA5551ToRGBA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels); void RGB555ToRGBA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels);
void RGB888ToRGBA8888Buffer(const uint32_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels); void RGBA8888ForceOpaqueBuffer(const uint32_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels);
NSSize GetTransformedBounds(NSSize normalBounds, double scalar, double angleDegrees); NSSize GetTransformedBounds(NSSize normalBounds, double scalar, double angleDegrees);
double GetMaxScalarInBounds(double normalBoundsWidth, double normalBoundsHeight, double keepInBoundsWidth, double keepInBoundsHeight); double GetMaxScalarInBounds(double normalBoundsWidth, double normalBoundsHeight, double keepInBoundsWidth, double keepInBoundsHeight);
NSPoint GetNormalPointFromTransformedPoint(NSPoint transformedPt, NSSize normalBounds, NSSize transformBounds, double scalar, double angleDegrees); NSPoint GetNormalPointFromTransformedPoint(NSPoint transformedPt, NSSize normalBounds, NSSize transformBounds, double scalar, double angleDegrees);

View File

@ -19,6 +19,7 @@
#import "cocoa_util.h" #import "cocoa_util.h"
#import "cocoa_globals.h" #import "cocoa_globals.h"
#import "types.h" #import "types.h"
#import <Cocoa/Cocoa.h>
#include <Accelerate/Accelerate.h> #include <Accelerate/Accelerate.h>
#include <sys/types.h> #include <sys/types.h>
@ -320,12 +321,12 @@ static NSDate *distantFutureDate = [[NSDate distantFuture] retain];
@end @end
/******************************************************************************************** /********************************************************************************************
RGBA5551ToRGBA8888() - INLINE RGB555ToRGBA8888() - INLINE
Converts a color from 16-bit RGBA5551 format into 32-bit RGBA8888 format. Converts a color from 15-bit RGB555 format into 32-bit RGBA8888 format.
Takes: Takes:
color16 - The pixel in 16-bit RGBA5551 format. color16 - The pixel in 15-bit RGB555 format.
Returns: Returns:
A 32-bit unsigned integer containing the RGBA8888 formatted color. A 32-bit unsigned integer containing the RGBA8888 formatted color.
@ -333,7 +334,7 @@ static NSDate *distantFutureDate = [[NSDate distantFuture] retain];
Details: Details:
The input and output pixels are expected to have little-endian byte order. The input and output pixels are expected to have little-endian byte order.
********************************************************************************************/ ********************************************************************************************/
FORCEINLINE uint32_t RGBA5551ToRGBA8888(const uint16_t color16) FORCEINLINE uint32_t RGB555ToRGBA8888(const uint16_t color16)
{ {
return ((color16 & 0x001F) << 3) | return ((color16 & 0x001F) << 3) |
((color16 & 0x03E0) << 6) | ((color16 & 0x03E0) << 6) |
@ -342,31 +343,31 @@ FORCEINLINE uint32_t RGBA5551ToRGBA8888(const uint16_t color16)
} }
/******************************************************************************************** /********************************************************************************************
RGB888ToRGBA8888() - INLINE RGBA8888ForceOpaque() - INLINE
Converts a color from 24-bit RGB888 format into 32-bit RGBA8888 format.
Forces the alpha channel of a 32-bit RGBA8888 color to a value of 0xFF.
Takes: Takes:
color24 - The pixel in 24-bit RGB888 format. color32 - The pixel in 32-bit RGBA8888 format.
Returns: Returns:
A 32-bit unsigned integer containing the RGBA8888 formatted color. A 32-bit unsigned integer containing the RGBA8888 formatted color.
Details: Details:
The input and output pixels are expected to have little-endian byte order. The input and output pixels are expected to have little-endian byte order.
********************************************************************************************/ ********************************************************************************************/
FORCEINLINE uint32_t RGB888ToRGBA8888(const uint32_t color24) FORCEINLINE uint32_t RGBA8888ForceOpaque(const uint32_t color32)
{ {
return color24 | 0xFF000000; return color32 | 0xFF000000;
} }
/******************************************************************************************** /********************************************************************************************
RGBA5551ToRGBA8888Buffer() RGB555ToRGBA8888Buffer()
Copies a 16-bit RGBA5551 pixel buffer into a 32-bit RGBA8888 pixel buffer. Copies a 15-bit RGB555 pixel buffer into a 32-bit RGBA8888 pixel buffer.
Takes: Takes:
srcBuffer - Pointer to the source 16-bit RGBA5551 pixel buffer. srcBuffer - Pointer to the source 15-bit RGB555 pixel buffer.
destBuffer - Pointer to the destination 32-bit RGBA8888 pixel buffer. destBuffer - Pointer to the destination 32-bit RGBA8888 pixel buffer.
@ -380,23 +381,24 @@ FORCEINLINE uint32_t RGB888ToRGBA8888(const uint32_t color24)
Also, it is the caller's responsibility to ensure that the source and destination Also, it is the caller's responsibility to ensure that the source and destination
buffers are large enough to accomodate the requested number of pixels. buffers are large enough to accomodate the requested number of pixels.
********************************************************************************************/ ********************************************************************************************/
void RGBA5551ToRGBA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels) void RGB555ToRGBA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels)
{ {
const uint32_t *__restrict__ destBufferEnd = destBuffer + numberPixels; const uint32_t *__restrict__ destBufferEnd = destBuffer + numberPixels;
while (destBuffer < destBufferEnd) while (destBuffer < destBufferEnd)
{ {
*destBuffer++ = RGBA5551ToRGBA8888(*srcBuffer++); *destBuffer++ = RGB555ToRGBA8888(*srcBuffer++);
} }
} }
/******************************************************************************************** /********************************************************************************************
RGB888ToRGBA8888Buffer() RGBA8888ForceOpaqueBuffer()
Copies a 24-bit RGB888 pixel buffer into a 32-bit RGBA8888 pixel buffer. Copies a 32-bit RGBA8888 pixel buffer into another 32-bit RGBA8888 pixel buffer.
The pixels in the destination buffer will have an alpha value of 0xFF.
Takes: Takes:
srcBuffer - Pointer to the source 24-bit RGB888 pixel buffer. srcBuffer - Pointer to the source 32-bit RGBA8888 pixel buffer.
destBuffer - Pointer to the destination 32-bit RGBA8888 pixel buffer. destBuffer - Pointer to the destination 32-bit RGBA8888 pixel buffer.
@ -410,13 +412,13 @@ void RGBA5551ToRGBA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *
Also, it is the caller's responsibility to ensure that the source and destination Also, it is the caller's responsibility to ensure that the source and destination
buffers are large enough to accomodate the requested number of pixels. buffers are large enough to accomodate the requested number of pixels.
********************************************************************************************/ ********************************************************************************************/
void RGB888ToRGBA8888Buffer(const uint32_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels) void RGBA8888ForceOpaqueBuffer(const uint32_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels)
{ {
const uint32_t *__restrict__ destBufferEnd = destBuffer + numberPixels; const uint32_t *__restrict__ destBufferEnd = destBuffer + numberPixels;
while (destBuffer < destBufferEnd) while (destBuffer < destBufferEnd)
{ {
*destBuffer++ = RGB888ToRGBA8888(*srcBuffer++); *destBuffer++ = RGBA8888ForceOpaque(*srcBuffer++);
} }
} }

View File

@ -139,7 +139,7 @@
} }
uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData]; uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData];
RGB888ToRGBA8888Buffer((const uint32_t *)[self runFilter], bitmapData, (w * h)); RGBA8888ForceOpaqueBuffer((const uint32_t *)[self runFilter], bitmapData, (w * h));
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
uint32_t *bitmapDataEnd = bitmapData + (w * h); uint32_t *bitmapDataEnd = bitmapData + (w * h);

View File

@ -22,6 +22,12 @@
#import "cocoa_output.h" #import "cocoa_output.h"
enum OGLVertexAttributeID
{
OGLVertexAttributeID_Position = 0,
OGLVertexAttributeID_TexCoord0 = 8
};
@class DisplayViewDelegate; @class DisplayViewDelegate;
@class CocoaDSController; @class CocoaDSController;
@ -154,22 +160,16 @@
unsigned int vtxBufferOffset; unsigned int vtxBufferOffset;
} }
- (void) setupOpenGL_Legacy; - (void) setupOpenGL;
- (void) shutdownOpenGL;
- (void) setupShaderIO;
- (BOOL) setupShadersWithVertexProgram:(const char *)vertShaderProgram fragmentProgram:(const char *)fragShaderProgram;
- (void) drawVideoFrame; - (void) drawVideoFrame;
- (void) uploadVertices;
- (void) uploadTexCoords;
- (void) uploadDisplayTextures:(const GLvoid *)textureData displayMode:(const NSInteger)displayModeID width:(const GLsizei)texWidth height:(const GLsizei)texHeight; - (void) uploadDisplayTextures:(const GLvoid *)textureData displayMode:(const NSInteger)displayModeID width:(const GLsizei)texWidth height:(const GLsizei)texHeight;
- (void) renderDisplayUsingDisplayMode:(const NSInteger)displayModeID; - (void) renderDisplayUsingDisplayMode:(const NSInteger)displayModeID;
- (void) updateDisplayVerticesUsingDisplayMode:(const NSInteger)displayModeID orientation:(const NSInteger)displayOrientationID; - (void) updateDisplayVerticesUsingDisplayMode:(const NSInteger)displayModeID orientation:(const NSInteger)displayOrientationID;
- (void) updateTexCoordS:(GLfloat)s T:(GLfloat)t; - (void) updateTexCoordS:(GLfloat)s T:(GLfloat)t;
@end @end
#ifdef __cplusplus
extern "C"
{
#endif
GLint SetupShaders(GLuint *programID, GLuint *vertShaderID, GLuint *fragShaderID, const char *vertShaderProgram, const char *fragShaderProgram);
#ifdef __cplusplus
}
#endif

View File

@ -24,14 +24,14 @@
#import "cocoa_videofilter.h" #import "cocoa_videofilter.h"
#import "cocoa_util.h" #import "cocoa_util.h"
#include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h> #include <OpenGL/gl.h>
#include <OpenGL/glext.h>
#include <OpenGL/glu.h> #include <OpenGL/glu.h>
#undef BOOL #undef BOOL
// VERTEX SHADER FOR DISPLAY OUTPUT // VERTEX SHADER FOR DISPLAY OUTPUT
const char *vShader_100 = {"\ const char *vertexProgram_100 = {"\
attribute vec2 inPosition; \n\ attribute vec2 inPosition; \n\
attribute vec2 inTexCoord0; \n\ attribute vec2 inTexCoord0; \n\
\n\ \n\
@ -60,7 +60,7 @@ const char *vShader_100 = {"\
"}; "};
// FRAGMENT SHADER FOR DISPLAY OUTPUT // FRAGMENT SHADER FOR DISPLAY OUTPUT
const char *fShader_100 = {"\ const char *fragmentProgram_100 = {"\
varying vec2 vtxTexCoord; \n\ varying vec2 vtxTexCoord; \n\
uniform sampler2D tex; \n\ uniform sampler2D tex; \n\
\n\ \n\
@ -70,12 +70,6 @@ const char *fShader_100 = {"\
} \n\ } \n\
"}; "};
enum OGLVertexAttributeID
{
OGLVertexAttributeID_Position = 0,
OGLVertexAttributeID_TexCoord0 = 8,
};
@implementation DisplayViewDelegate @implementation DisplayViewDelegate
@ -824,7 +818,7 @@ enum OGLVertexAttributeID
} }
uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData]; uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData];
RGBA5551ToRGBA8888Buffer((const uint16_t *)videoFrameData, bitmapData, (imageWidth * imageHeight)); RGB555ToRGBA8888Buffer((const uint16_t *)videoFrameData, bitmapData, (imageWidth * imageHeight));
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
uint32_t *bitmapDataEnd = bitmapData + (imageWidth * imageHeight); uint32_t *bitmapDataEnd = bitmapData + (imageWidth * imageHeight);
@ -1003,24 +997,7 @@ enum OGLVertexAttributeID
CGLContextObj prevContext = CGLGetCurrentContext(); CGLContextObj prevContext = CGLGetCurrentContext();
CGLSetCurrentContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext);
glDeleteTextures(1, &displayTexID); [self shutdownOpenGL];
glDeleteVertexArraysAPPLE(1, &vaoMainStatesID);
glDeleteBuffersARB(1, &vboVertexID);
glDeleteBuffersARB(1, &vboTexCoordID);
glDeleteBuffersARB(1, &vboElementID);
if (isShaderSupported)
{
glUseProgram(0);
glDetachShader(shaderProgram, vertexShaderID);
glDetachShader(shaderProgram, fragmentShaderID);
glDeleteProgram(shaderProgram);
glDeleteShader(vertexShaderID);
glDeleteShader(fragmentShaderID);
}
CGLSetCurrentContext(prevContext); CGLSetCurrentContext(prevContext);
@ -1061,10 +1038,10 @@ enum OGLVertexAttributeID
vtxIndexBuffer[6] = 4; vtxIndexBuffer[7] = 5; vtxIndexBuffer[8] = 6; vtxIndexBuffer[6] = 4; vtxIndexBuffer[7] = 5; vtxIndexBuffer[8] = 6;
vtxIndexBuffer[9] = 6; vtxIndexBuffer[10] = 7; vtxIndexBuffer[11] = 4; vtxIndexBuffer[9] = 6; vtxIndexBuffer[10] = 7; vtxIndexBuffer[11] = 4;
[self setupOpenGL_Legacy]; [self setupOpenGL];
} }
- (void) setupOpenGL_Legacy - (void) setupOpenGL
{ {
// Check the OpenGL capabilities for this renderer // Check the OpenGL capabilities for this renderer
const GLubyte *glExtString = glGetString(GL_EXTENSIONS); const GLubyte *glExtString = glGetString(GL_EXTENSIONS);
@ -1089,8 +1066,8 @@ enum OGLVertexAttributeID
#endif #endif
if (isShaderSupported) if (isShaderSupported)
{ {
GLint shaderStatus = SetupShaders(&shaderProgram, &vertexShaderID, &fragmentShaderID, vShader_100, fShader_100); BOOL isShaderSetUp = [self setupShadersWithVertexProgram:vertexProgram_100 fragmentProgram:fragmentProgram_100];
if (shaderStatus == GL_TRUE) if (isShaderSetUp)
{ {
glUseProgram(shaderProgram); glUseProgram(shaderProgram);
@ -1172,11 +1149,125 @@ enum OGLVertexAttributeID
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
} }
- (void) shutdownOpenGL
{
glDeleteTextures(1, &displayTexID);
glDeleteVertexArraysAPPLE(1, &vaoMainStatesID);
glDeleteBuffersARB(1, &vboVertexID);
glDeleteBuffersARB(1, &vboTexCoordID);
glDeleteBuffersARB(1, &vboElementID);
if (isShaderSupported)
{
glUseProgram(0);
glDetachShader(shaderProgram, vertexShaderID);
glDetachShader(shaderProgram, fragmentShaderID);
glDeleteProgram(shaderProgram);
glDeleteShader(vertexShaderID);
glDeleteShader(fragmentShaderID);
}
}
- (void) setupShaderIO
{
glBindAttribLocation(shaderProgram, OGLVertexAttributeID_Position, "inPosition");
glBindAttribLocation(shaderProgram, OGLVertexAttributeID_TexCoord0, "inTexCoord0");
}
- (BOOL) setupShadersWithVertexProgram:(const char *)vertShaderProgram fragmentProgram:(const char *)fragShaderProgram
{
BOOL result = NO;
GLint shaderStatus = GL_TRUE;
vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
if (vertexShaderID == 0)
{
NSLog(@"OpenGL Error - Failed to create vertex shader.");
return result;
}
glShaderSource(vertexShaderID, 1, (const GLchar **)&vertShaderProgram, NULL);
glCompileShader(vertexShaderID);
glGetShaderiv(vertexShaderID, GL_COMPILE_STATUS, &shaderStatus);
if (shaderStatus == GL_FALSE)
{
glDeleteShader(vertexShaderID);
NSLog(@"OpenGL Error - Failed to compile vertex shader.");
return result;
}
fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
if (fragmentShaderID == 0)
{
glDeleteShader(vertexShaderID);
NSLog(@"OpenGL Error - Failed to create fragment shader.");
return result;
}
glShaderSource(fragmentShaderID, 1, (const GLchar **)&fragShaderProgram, NULL);
glCompileShader(fragmentShaderID);
glGetShaderiv(fragmentShaderID, GL_COMPILE_STATUS, &shaderStatus);
if (shaderStatus == GL_FALSE)
{
glDeleteShader(vertexShaderID);
glDeleteShader(fragmentShaderID);
NSLog(@"OpenGL Error - Failed to compile fragment shader.");
return result;
}
shaderProgram = glCreateProgram();
if (shaderProgram == 0)
{
glDeleteShader(vertexShaderID);
glDeleteShader(fragmentShaderID);
NSLog(@"OpenGL Error - Failed to create shader program.");
return result;
}
glAttachShader(shaderProgram, vertexShaderID);
glAttachShader(shaderProgram, fragmentShaderID);
[self setupShaderIO];
glLinkProgram(shaderProgram);
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &shaderStatus);
if (shaderStatus == GL_FALSE)
{
glDeleteProgram(shaderProgram);
glDeleteShader(vertexShaderID);
glDeleteShader(fragmentShaderID);
NSLog(@"OpenGL Error - Failed to link shader program.");
return result;
}
glValidateProgram(shaderProgram);
result = YES;
return result;
}
- (void) drawVideoFrame - (void) drawVideoFrame
{ {
CGLFlushDrawable(cglDisplayContext); CGLFlushDrawable(cglDisplayContext);
} }
- (void) uploadVertices
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLint) * (2 * 8), vtxBuffer + vtxBufferOffset);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
}
- (void) uploadTexCoords
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLfloat) * (2 * 8), texCoordBuffer);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
}
- (void) uploadDisplayTextures:(const GLvoid *)textureData displayMode:(const NSInteger)displayModeID width:(const GLsizei)texWidth height:(const GLsizei)texHeight - (void) uploadDisplayTextures:(const GLvoid *)textureData displayMode:(const NSInteger)displayModeID width:(const GLsizei)texWidth height:(const GLsizei)texHeight
{ {
if (textureData == NULL) if (textureData == NULL)
@ -1201,10 +1292,7 @@ enum OGLVertexAttributeID
{ {
lastDisplayMode = displayModeID; lastDisplayMode = displayModeID;
[self updateDisplayVerticesUsingDisplayMode:displayModeID orientation:currentDisplayOrientation]; [self updateDisplayVerticesUsingDisplayMode:displayModeID orientation:currentDisplayOrientation];
[self uploadVertices];
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID);
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;
@ -1391,8 +1479,8 @@ enum OGLVertexAttributeID
- (void)doProcessVideoFrame:(const void *)videoFrameData displayMode:(const NSInteger)displayModeID width:(const NSInteger)frameWidth height:(const NSInteger)frameHeight - (void)doProcessVideoFrame:(const void *)videoFrameData displayMode:(const NSInteger)displayModeID width:(const NSInteger)frameWidth height:(const NSInteger)frameHeight
{ {
CGLLockContext(cglDisplayContext); CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext);
[self uploadDisplayTextures:videoFrameData displayMode:displayModeID width:frameWidth height:frameHeight]; [self uploadDisplayTextures:videoFrameData displayMode:displayModeID width:frameWidth height:frameHeight];
[self renderDisplayUsingDisplayMode:displayModeID]; [self renderDisplayUsingDisplayMode:displayModeID];
[self drawVideoFrame]; [self drawVideoFrame];
@ -1421,7 +1509,7 @@ enum OGLVertexAttributeID
CGLUnlockContext(cglDisplayContext); CGLUnlockContext(cglDisplayContext);
} }
- (void) doTransformView:(const DisplayOutputTransformData *)transformData - (void)doTransformView:(const DisplayOutputTransformData *)transformData
{ {
const GLfloat angleDegrees = (GLfloat)transformData->rotation; const GLfloat angleDegrees = (GLfloat)transformData->rotation;
const GLfloat s = (GLfloat)transformData->scale; const GLfloat s = (GLfloat)transformData->scale;
@ -1448,8 +1536,8 @@ enum OGLVertexAttributeID
- (void)doRedraw - (void)doRedraw
{ {
CGLLockContext(cglDisplayContext); CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext);
[self renderDisplayUsingDisplayMode:lastDisplayMode]; [self renderDisplayUsingDisplayMode:lastDisplayMode];
[self drawVideoFrame]; [self drawVideoFrame];
@ -1464,9 +1552,7 @@ enum OGLVertexAttributeID
CGLLockContext(cglDisplayContext); CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID); [self uploadVertices];
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLint) * (2 * 8), vtxBuffer + vtxBufferOffset);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
CGLUnlockContext(cglDisplayContext); CGLUnlockContext(cglDisplayContext);
} }
@ -1476,6 +1562,7 @@ enum OGLVertexAttributeID
const GLint textureFilter = useBilinear ? GL_LINEAR : GL_NEAREST; const GLint textureFilter = useBilinear ? GL_LINEAR : GL_NEAREST;
CGLLockContext(cglDisplayContext); CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext);
glBindTexture(GL_TEXTURE_2D, displayTexID); glBindTexture(GL_TEXTURE_2D, displayTexID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, textureFilter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, textureFilter);
@ -1493,9 +1580,7 @@ enum OGLVertexAttributeID
CGLLockContext(cglDisplayContext); CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID); [self uploadVertices];
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLint) * (2 * 8), vtxBuffer + vtxBufferOffset);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
CGLUnlockContext(cglDisplayContext); CGLUnlockContext(cglDisplayContext);
} }
@ -1514,9 +1599,7 @@ enum OGLVertexAttributeID
CGLLockContext(cglDisplayContext); CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID); [self uploadVertices];
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)
{ {
@ -1530,7 +1613,6 @@ enum OGLVertexAttributeID
- (void)doVerticalSyncChanged:(BOOL)useVerticalSync - (void)doVerticalSyncChanged:(BOOL)useVerticalSync
{ {
const GLint swapInt = useVerticalSync ? 1 : 0; const GLint swapInt = useVerticalSync ? 1 : 0;
CGLSetParameter(cglDisplayContext, kCGLCPSwapInterval, &swapInt); CGLSetParameter(cglDisplayContext, kCGLCPSwapInterval, &swapInt);
} }
@ -1573,87 +1655,15 @@ enum OGLVertexAttributeID
[self updateTexCoordS:s T:t]; [self updateTexCoordS:s T:t];
CGLLockContext(cglDisplayContext); CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext);
glBindTexture(GL_TEXTURE_2D, displayTexID); glBindTexture(GL_TEXTURE_2D, displayTexID);
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);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID); [self uploadTexCoords];
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLfloat) * (2 * 8), texCoordBuffer);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
CGLUnlockContext(cglDisplayContext); CGLUnlockContext(cglDisplayContext);
} }
@end @end
GLint SetupShaders(GLuint *programID, GLuint *vertShaderID, GLuint *fragShaderID, const char *vertShaderProgram, const char *fragShaderProgram)
{
GLint shaderStatus = GL_TRUE;
*vertShaderID = glCreateShader(GL_VERTEX_SHADER);
if (*vertShaderID == 0)
{
NSLog(@"OpenGL Error - Failed to create vertex shader.");
return shaderStatus;
}
glShaderSource(*vertShaderID, 1, (const GLchar **)&vertShaderProgram, NULL);
glCompileShader(*vertShaderID);
glGetShaderiv(*vertShaderID, GL_COMPILE_STATUS, &shaderStatus);
if (shaderStatus == GL_FALSE)
{
glDeleteShader(*vertShaderID);
NSLog(@"OpenGL Error - Failed to compile vertex shader.");
return shaderStatus;
}
*fragShaderID = glCreateShader(GL_FRAGMENT_SHADER);
if (*fragShaderID == 0)
{
glDeleteShader(*vertShaderID);
NSLog(@"OpenGL Error - Failed to create fragment shader.");
return shaderStatus;
}
glShaderSource(*fragShaderID, 1, (const GLchar **)&fragShaderProgram, NULL);
glCompileShader(*fragShaderID);
glGetShaderiv(*fragShaderID, GL_COMPILE_STATUS, &shaderStatus);
if (shaderStatus == GL_FALSE)
{
glDeleteShader(*vertShaderID);
glDeleteShader(*fragShaderID);
NSLog(@"OpenGL Error - Failed to compile fragment shader.");
return shaderStatus;
}
*programID = glCreateProgram();
if (*programID == 0)
{
glDeleteShader(*vertShaderID);
glDeleteShader(*fragShaderID);
NSLog(@"OpenGL Error - Failed to create shader program.");
return shaderStatus;
}
glAttachShader(*programID, *vertShaderID);
glAttachShader(*programID, *fragShaderID);
glBindAttribLocation(*programID, OGLVertexAttributeID_Position, "inPosition");
glBindAttribLocation(*programID, OGLVertexAttributeID_TexCoord0, "inTexCoord0");
glLinkProgram(*programID);
glGetProgramiv(*programID, GL_LINK_STATUS, &shaderStatus);
if (shaderStatus == GL_FALSE)
{
glDeleteProgram(*programID);
glDeleteShader(*vertShaderID);
glDeleteShader(*fragShaderID);
NSLog(@"OpenGL Error - Failed to link shader program.");
return shaderStatus;
}
glValidateProgram(*programID);
return shaderStatus;
}

View File

@ -81,7 +81,7 @@
NSArray *imageRepArray = [videoFilterImage representations]; NSArray *imageRepArray = [videoFilterImage representations];
const NSBitmapImageRep *imageRep = [imageRepArray objectAtIndex:0]; const NSBitmapImageRep *imageRep = [imageRepArray objectAtIndex:0];
RGB888ToRGBA8888Buffer((const uint32_t *)[imageRep bitmapData], (uint32_t *)[videoFilter srcBufferPtr], (64 * 64)); RGBA8888ForceOpaqueBuffer((const uint32_t *)[imageRep bitmapData], (uint32_t *)[videoFilter srcBufferPtr], (64 * 64));
[videoFilterImage release]; [videoFilterImage release];
BOOL useBilinear = [[NSUserDefaults standardUserDefaults] boolForKey:@"DisplayView_UseBilinearOutput"]; BOOL useBilinear = [[NSUserDefaults standardUserDefaults] boolForKey:@"DisplayView_UseBilinearOutput"];
@ -118,7 +118,7 @@
} }
} }
RGB888ToRGBA8888Buffer((const uint32_t *)[videoFilter runFilter], (uint32_t *)[bilinearVideoFilter srcBufferPtr], (vfWidth * vfHeight)); RGBA8888ForceOpaqueBuffer((const uint32_t *)[videoFilter runFilter], (uint32_t *)[bilinearVideoFilter srcBufferPtr], (vfWidth * vfHeight));
[bindings setObject:[bilinearVideoFilter image] forKey:@"VideoFilterPreviewImage"]; [bindings setObject:[bilinearVideoFilter image] forKey:@"VideoFilterPreviewImage"];
iconVolumeFull = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeFull_16x16" ofType:@"png"]]; iconVolumeFull = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeFull_16x16" ofType:@"png"]];
@ -501,7 +501,7 @@
} }
} }
RGB888ToRGBA8888Buffer((const uint32_t *)[videoFilter runFilter], (uint32_t *)[bilinearVideoFilter srcBufferPtr], (vfWidth * vfHeight)); RGBA8888ForceOpaqueBuffer((const uint32_t *)[videoFilter runFilter], (uint32_t *)[bilinearVideoFilter srcBufferPtr], (vfWidth * vfHeight));
NSBitmapImageRep *newPreviewImageRep = [bilinearVideoFilter bitmapImageRep]; NSBitmapImageRep *newPreviewImageRep = [bilinearVideoFilter bitmapImageRep];
NSImage *videoFilterPreviewImage = [bindings objectForKey:@"VideoFilterPreviewImage"]; NSImage *videoFilterPreviewImage = [bindings objectForKey:@"VideoFilterPreviewImage"];