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/>.
*/
#import <Cocoa/Cocoa.h>
#import <Foundation/Foundation.h>
#include <pthread.h>
#include <libkern/OSAtomic.h>
#import "cocoa_util.h"
@class NSImage;
@class NSBitmapImageRep;
typedef struct
{

View File

@ -28,14 +28,15 @@
#include "../SPU.h"
#include "../metaspu/metaspu.h"
#include <OpenGL/OpenGL.h>
#ifdef MAC_OS_X_VERSION_10_7
#include "../OGLRender_3_2.h"
#else
#include "../OGLRender.h"
#endif
#import <Cocoa/Cocoa.h>
#include <OpenGL/OpenGL.h>
#undef BOOL
GPU3DInterface *core3DList[] = {
@ -1320,7 +1321,7 @@ GPU3DInterface *core3DList[] = {
}
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__
uint32_t *bitmapDataEnd = bitmapData + (w * h);
@ -1622,7 +1623,7 @@ GPU3DInterface *core3DList[] = {
}
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];
[videoDelegate doProcessVideoFrame:vfDestBuffer displayMode:displayModeID width:destWidth height:destHeight];
}
@ -1973,6 +1974,7 @@ void DestroyOpenGLRenderer()
CGLReleasePBuffer(OSXOpenGLRendererPBuffer);
CGLReleaseContext(OSXOpenGLRendererContext);
OSXOpenGLRendererContext = NULL;
OSXOpenGLRendererPBuffer = NULL;
}
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;
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.
//
// The first entry always represents the alpha, so we can just ignore it.
clut[0] = 0x00000000;
RGBA5551ToRGBA8888Buffer(iconClutPtr, &clut[1], 15);
RGB555ToRGBA8888Buffer(iconClutPtr, &clut[1], 15);
// 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/>.
*/
#import <Cocoa/Cocoa.h>
#import <Foundation/Foundation.h>
#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
#include "macosx_10_4_compat.h"
@ -93,10 +93,10 @@ extern "C"
{
#endif
uint32_t RGBA5551ToRGBA8888(const uint16_t color16);
uint32_t RGBA8888ToRGB888(const uint32_t color24);
void RGBA5551ToRGBA8888Buffer(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);
uint32_t RGB555ToRGBA8888(const uint16_t color16);
uint32_t RGBA8888ForceOpaque(const uint32_t color32);
void RGB555ToRGBA8888Buffer(const uint16_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);
double GetMaxScalarInBounds(double normalBoundsWidth, double normalBoundsHeight, double keepInBoundsWidth, double keepInBoundsHeight);
NSPoint GetNormalPointFromTransformedPoint(NSPoint transformedPt, NSSize normalBounds, NSSize transformBounds, double scalar, double angleDegrees);

View File

@ -19,6 +19,7 @@
#import "cocoa_util.h"
#import "cocoa_globals.h"
#import "types.h"
#import <Cocoa/Cocoa.h>
#include <Accelerate/Accelerate.h>
#include <sys/types.h>
@ -320,12 +321,12 @@ static NSDate *distantFutureDate = [[NSDate distantFuture] retain];
@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:
color16 - The pixel in 16-bit RGBA5551 format.
color16 - The pixel in 15-bit RGB555 format.
Returns:
A 32-bit unsigned integer containing the RGBA8888 formatted color.
@ -333,7 +334,7 @@ static NSDate *distantFutureDate = [[NSDate distantFuture] retain];
Details:
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) |
((color16 & 0x03E0) << 6) |
@ -342,31 +343,31 @@ FORCEINLINE uint32_t RGBA5551ToRGBA8888(const uint16_t color16)
}
/********************************************************************************************
RGB888ToRGBA8888() - INLINE
Converts a color from 24-bit RGB888 format into 32-bit RGBA8888 format.
RGBA8888ForceOpaque() - INLINE
Forces the alpha channel of a 32-bit RGBA8888 color to a value of 0xFF.
Takes:
color24 - The pixel in 24-bit RGB888 format.
color32 - The pixel in 32-bit RGBA8888 format.
Returns:
A 32-bit unsigned integer containing the RGBA8888 formatted color.
Details:
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:
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.
@ -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
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;
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:
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.
@ -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
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;
while (destBuffer < destBufferEnd)
{
*destBuffer++ = RGB888ToRGBA8888(*srcBuffer++);
*destBuffer++ = RGBA8888ForceOpaque(*srcBuffer++);
}
}

View File

@ -139,7 +139,7 @@
}
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__
uint32_t *bitmapDataEnd = bitmapData + (w * h);

View File

@ -22,6 +22,12 @@
#import "cocoa_output.h"
enum OGLVertexAttributeID
{
OGLVertexAttributeID_Position = 0,
OGLVertexAttributeID_TexCoord0 = 8
};
@class DisplayViewDelegate;
@class CocoaDSController;
@ -154,22 +160,16 @@
unsigned int vtxBufferOffset;
}
- (void) setupOpenGL_Legacy;
- (void) setupOpenGL;
- (void) shutdownOpenGL;
- (void) setupShaderIO;
- (BOOL) setupShadersWithVertexProgram:(const char *)vertShaderProgram fragmentProgram:(const char *)fragShaderProgram;
- (void) drawVideoFrame;
- (void) uploadVertices;
- (void) uploadTexCoords;
- (void) uploadDisplayTextures:(const GLvoid *)textureData displayMode:(const NSInteger)displayModeID width:(const GLsizei)texWidth height:(const GLsizei)texHeight;
- (void) renderDisplayUsingDisplayMode:(const NSInteger)displayModeID;
- (void) updateDisplayVerticesUsingDisplayMode:(const NSInteger)displayModeID orientation:(const NSInteger)displayOrientationID;
- (void) updateTexCoordS:(GLfloat)s T:(GLfloat)t;
@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_util.h"
#include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h>
#include <OpenGL/glext.h>
#include <OpenGL/glu.h>
#undef BOOL
// VERTEX SHADER FOR DISPLAY OUTPUT
const char *vShader_100 = {"\
const char *vertexProgram_100 = {"\
attribute vec2 inPosition; \n\
attribute vec2 inTexCoord0; \n\
\n\
@ -60,7 +60,7 @@ const char *vShader_100 = {"\
"};
// FRAGMENT SHADER FOR DISPLAY OUTPUT
const char *fShader_100 = {"\
const char *fragmentProgram_100 = {"\
varying vec2 vtxTexCoord; \n\
uniform sampler2D tex; \n\
\n\
@ -70,12 +70,6 @@ const char *fShader_100 = {"\
} \n\
"};
enum OGLVertexAttributeID
{
OGLVertexAttributeID_Position = 0,
OGLVertexAttributeID_TexCoord0 = 8,
};
@implementation DisplayViewDelegate
@ -824,7 +818,7 @@ enum OGLVertexAttributeID
}
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__
uint32_t *bitmapDataEnd = bitmapData + (imageWidth * imageHeight);
@ -1003,24 +997,7 @@ enum OGLVertexAttributeID
CGLContextObj prevContext = CGLGetCurrentContext();
CGLSetCurrentContext(cglDisplayContext);
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);
}
[self shutdownOpenGL];
CGLSetCurrentContext(prevContext);
@ -1061,10 +1038,10 @@ enum OGLVertexAttributeID
vtxIndexBuffer[6] = 4; vtxIndexBuffer[7] = 5; vtxIndexBuffer[8] = 6;
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
const GLubyte *glExtString = glGetString(GL_EXTENSIONS);
@ -1089,8 +1066,8 @@ enum OGLVertexAttributeID
#endif
if (isShaderSupported)
{
GLint shaderStatus = SetupShaders(&shaderProgram, &vertexShaderID, &fragmentShaderID, vShader_100, fShader_100);
if (shaderStatus == GL_TRUE)
BOOL isShaderSetUp = [self setupShadersWithVertexProgram:vertexProgram_100 fragmentProgram:fragmentProgram_100];
if (isShaderSetUp)
{
glUseProgram(shaderProgram);
@ -1172,11 +1149,125 @@ enum OGLVertexAttributeID
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
{
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
{
if (textureData == NULL)
@ -1201,10 +1292,7 @@ enum OGLVertexAttributeID
{
lastDisplayMode = displayModeID;
[self updateDisplayVerticesUsingDisplayMode:displayModeID orientation:currentDisplayOrientation];
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLint) * (2 * 8), vtxBuffer + vtxBufferOffset);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
[self uploadVertices];
}
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
{
CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext);
[self uploadDisplayTextures:videoFrameData displayMode:displayModeID width:frameWidth height:frameHeight];
[self renderDisplayUsingDisplayMode:displayModeID];
[self drawVideoFrame];
@ -1421,7 +1509,7 @@ enum OGLVertexAttributeID
CGLUnlockContext(cglDisplayContext);
}
- (void) doTransformView:(const DisplayOutputTransformData *)transformData
- (void)doTransformView:(const DisplayOutputTransformData *)transformData
{
const GLfloat angleDegrees = (GLfloat)transformData->rotation;
const GLfloat s = (GLfloat)transformData->scale;
@ -1448,8 +1536,8 @@ enum OGLVertexAttributeID
- (void)doRedraw
{
CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext);
[self renderDisplayUsingDisplayMode:lastDisplayMode];
[self drawVideoFrame];
@ -1464,9 +1552,7 @@ enum OGLVertexAttributeID
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, 0);
[self uploadVertices];
CGLUnlockContext(cglDisplayContext);
}
@ -1476,6 +1562,7 @@ enum OGLVertexAttributeID
const GLint textureFilter = useBilinear ? GL_LINEAR : GL_NEAREST;
CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext);
glBindTexture(GL_TEXTURE_2D, displayTexID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, textureFilter);
@ -1493,9 +1580,7 @@ enum OGLVertexAttributeID
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, 0);
[self uploadVertices];
CGLUnlockContext(cglDisplayContext);
}
@ -1514,9 +1599,7 @@ enum OGLVertexAttributeID
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, 0);
[self uploadVertices];
if (lastDisplayMode == DS_DISPLAY_TYPE_COMBO)
{
@ -1530,7 +1613,6 @@ enum OGLVertexAttributeID
- (void)doVerticalSyncChanged:(BOOL)useVerticalSync
{
const GLint swapInt = useVerticalSync ? 1 : 0;
CGLSetParameter(cglDisplayContext, kCGLCPSwapInterval, &swapInt);
}
@ -1573,87 +1655,15 @@ enum OGLVertexAttributeID
[self updateTexCoordS:s T:t];
CGLLockContext(cglDisplayContext);
CGLSetCurrentContext(cglDisplayContext);
glBindTexture(GL_TEXTURE_2D, displayTexID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)potW, (GLsizei)potH, 0, GL_BGRA, glTexPixelFormat, glTexBack);
glBindTexture(GL_TEXTURE_2D, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLfloat) * (2 * 8), texCoordBuffer);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
[self uploadTexCoords];
CGLUnlockContext(cglDisplayContext);
}
@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];
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];
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"];
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];
NSImage *videoFilterPreviewImage = [bindings objectForKey:@"VideoFilterPreviewImage"];