parent
f923c7a493
commit
0fd5648ab6
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
//
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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++);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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"];
|
||||
|
|
Loading…
Reference in New Issue