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