OS X: Consolidate the SoftGL plug-in's OpenGL functions into one file again.
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@92231 e17a0e51-4ae3-4d35-97c3-1a29b211df97
This commit is contained in:
parent
85f51f61c8
commit
f7961efaee
|
@ -217,8 +217,6 @@
|
||||||
55DFBAAF197B8CCD00620084 /* Pcsxr-QL.qlgenerator in Copy QuickLook Plug-In */ = {isa = PBXBuildFile; fileRef = 550E343718E6293D00A1AD21 /* Pcsxr-QL.qlgenerator */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
55DFBAAF197B8CCD00620084 /* Pcsxr-QL.qlgenerator in Copy QuickLook Plug-In */ = {isa = PBXBuildFile; fileRef = 550E343718E6293D00A1AD21 /* Pcsxr-QL.qlgenerator */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
||||||
55E0ACE0178B69620005C945 /* LaunchArg.m in Sources */ = {isa = PBXBuildFile; fileRef = 55E0ACDF178B69600005C945 /* LaunchArg.m */; };
|
55E0ACE0178B69620005C945 /* LaunchArg.m in Sources */ = {isa = PBXBuildFile; fileRef = 55E0ACDF178B69600005C945 /* LaunchArg.m */; };
|
||||||
55E15994184564D4007983CB /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 55E15993184564D4007983CB /* GLKit.framework */; };
|
55E15994184564D4007983CB /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 55E15993184564D4007983CB /* GLKit.framework */; };
|
||||||
55E15996184567D5007983CB /* GL2Code.m in Sources */ = {isa = PBXBuildFile; fileRef = 55E15995184567D5007983CB /* GL2Code.m */; };
|
|
||||||
55E15998184567F4007983CB /* GL3Code.m in Sources */ = {isa = PBXBuildFile; fileRef = 55E15997184567F4007983CB /* GL3Code.m */; };
|
|
||||||
55EC05FB1788B1230053AC23 /* PcsxrMemCardArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 55EC05FA1788B1230053AC23 /* PcsxrMemCardArray.m */; };
|
55EC05FB1788B1230053AC23 /* PcsxrMemCardArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 55EC05FA1788B1230053AC23 /* PcsxrMemCardArray.m */; };
|
||||||
55EC05FE178916E80053AC23 /* MemBadgeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 55EC05FD178916E70053AC23 /* MemBadgeView.m */; };
|
55EC05FE178916E80053AC23 /* MemBadgeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 55EC05FD178916E70053AC23 /* MemBadgeView.m */; };
|
||||||
712FD1E81093096F00575A92 /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 712FD1E51093096F00575A92 /* debug.c */; };
|
712FD1E81093096F00575A92 /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 712FD1E51093096F00575A92 /* debug.c */; };
|
||||||
|
@ -783,8 +781,6 @@
|
||||||
55E1598C18455C60007983CB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/CheatWindow.strings; sourceTree = "<group>"; };
|
55E1598C18455C60007983CB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/CheatWindow.strings; sourceTree = "<group>"; };
|
||||||
55E1598E18455C78007983CB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/PcsxrMemCard.strings; sourceTree = "<group>"; };
|
55E1598E18455C78007983CB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/PcsxrMemCard.strings; sourceTree = "<group>"; };
|
||||||
55E15993184564D4007983CB /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; };
|
55E15993184564D4007983CB /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; };
|
||||||
55E15995184567D5007983CB /* GL2Code.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GL2Code.m; sourceTree = "<group>"; };
|
|
||||||
55E15997184567F4007983CB /* GL3Code.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GL3Code.m; sourceTree = "<group>"; };
|
|
||||||
55E159A31845BA55007983CB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Bladesio1PluginConfig.strings; sourceTree = "<group>"; };
|
55E159A31845BA55007983CB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Bladesio1PluginConfig.strings; sourceTree = "<group>"; };
|
||||||
55E159A51845BA57007983CB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Bladesio1PluginConfig.strings; sourceTree = "<group>"; };
|
55E159A51845BA57007983CB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Bladesio1PluginConfig.strings; sourceTree = "<group>"; };
|
||||||
55E159A71845BA63007983CB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/DFCdromPluginConfig.strings; sourceTree = "<group>"; };
|
55E159A71845BA63007983CB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/DFCdromPluginConfig.strings; sourceTree = "<group>"; };
|
||||||
|
@ -1393,8 +1389,6 @@
|
||||||
551A757C17868BEC0052D185 /* PluginWindowController.h */,
|
551A757C17868BEC0052D185 /* PluginWindowController.h */,
|
||||||
551A757D17868BEC0052D185 /* PluginWindowController.m */,
|
551A757D17868BEC0052D185 /* PluginWindowController.m */,
|
||||||
551A757E17868BEC0052D185 /* SGPUPreferences.h */,
|
551A757E17868BEC0052D185 /* SGPUPreferences.h */,
|
||||||
55E15995184567D5007983CB /* GL2Code.m */,
|
|
||||||
55E15997184567F4007983CB /* GL3Code.m */,
|
|
||||||
);
|
);
|
||||||
path = macsrc;
|
path = macsrc;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -2357,7 +2351,6 @@
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
55E15996184567D5007983CB /* GL2Code.m in Sources */,
|
|
||||||
551A76C41786954B0052D185 /* drawgl.m in Sources */,
|
551A76C41786954B0052D185 /* drawgl.m in Sources */,
|
||||||
551A76C51786954B0052D185 /* PluginConfigController.m in Sources */,
|
551A76C51786954B0052D185 /* PluginConfigController.m in Sources */,
|
||||||
551A76C61786954B0052D185 /* PluginGLView.m in Sources */,
|
551A76C61786954B0052D185 /* PluginGLView.m in Sources */,
|
||||||
|
@ -2368,7 +2361,6 @@
|
||||||
551A76CC178695840052D185 /* key.c in Sources */,
|
551A76CC178695840052D185 /* key.c in Sources */,
|
||||||
551A76CD178695840052D185 /* menu.c in Sources */,
|
551A76CD178695840052D185 /* menu.c in Sources */,
|
||||||
551A76CE178695840052D185 /* prim.c in Sources */,
|
551A76CE178695840052D185 /* prim.c in Sources */,
|
||||||
55E15998184567F4007983CB /* GL3Code.m in Sources */,
|
|
||||||
551A76CF178695840052D185 /* soft.c in Sources */,
|
551A76CF178695840052D185 /* soft.c in Sources */,
|
||||||
551A76D0178695840052D185 /* zn.c in Sources */,
|
551A76D0178695840052D185 /* zn.c in Sources */,
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,569 +0,0 @@
|
||||||
//
|
|
||||||
// GL2Code.m
|
|
||||||
// Pcsxr
|
|
||||||
//
|
|
||||||
// Created by C.W. Betts on 11/26/13.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
|
||||||
#include <OpenGL/gl.h>
|
|
||||||
#include <OpenGL/glext.h>
|
|
||||||
#include <OpenGL/glu.h>
|
|
||||||
#include <GLUT/glut.h>
|
|
||||||
#import "PluginGLView.h"
|
|
||||||
#import "SGPUPreferences.h"
|
|
||||||
#include "externals.h"
|
|
||||||
#undef BOOL
|
|
||||||
#include "gpu.h"
|
|
||||||
#include "swap.h"
|
|
||||||
|
|
||||||
#include <time.h>
|
|
||||||
extern time_t tStart;
|
|
||||||
|
|
||||||
static int mylog2(int val)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i=1; i<31; i++)
|
|
||||||
if (val <= (1 << i))
|
|
||||||
return (1 << i);
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@implementation PluginGLView (GL2)
|
|
||||||
|
|
||||||
- (BOOL)setupOpenGL2
|
|
||||||
{
|
|
||||||
const GLubyte * strExt;
|
|
||||||
|
|
||||||
// Init pixel format attribs
|
|
||||||
static const NSOpenGLPixelFormatAttribute attrs[] =
|
|
||||||
{
|
|
||||||
NSOpenGLPFAAccelerated,
|
|
||||||
NSOpenGLPFANoRecovery,
|
|
||||||
NSOpenGLPFADoubleBuffer,
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
// Get pixel format from OpenGL
|
|
||||||
NSOpenGLPixelFormat* pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
|
|
||||||
if (!pixFmt)
|
|
||||||
{
|
|
||||||
NSLog(@"No Accelerated OpenGL pixel format found\n");
|
|
||||||
|
|
||||||
static const NSOpenGLPixelFormatAttribute attrs2[] =
|
|
||||||
{
|
|
||||||
NSOpenGLPFANoRecovery,
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
// Get pixel format from OpenGL
|
|
||||||
pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs2];
|
|
||||||
if (!pixFmt) {
|
|
||||||
NSLog(@"No OpenGL pixel format found!\n");
|
|
||||||
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[self setPixelFormat:pixFmt];
|
|
||||||
|
|
||||||
/*
|
|
||||||
long swapInterval = 1 ;
|
|
||||||
[[self openGLContext]
|
|
||||||
setValues:&swapInterval
|
|
||||||
forParameter:NSOpenGLCPSwapInterval];
|
|
||||||
*/
|
|
||||||
[glLock lock];
|
|
||||||
[[self openGLContext] makeCurrentContext];
|
|
||||||
|
|
||||||
// Init object members
|
|
||||||
strExt = glGetString (GL_EXTENSIONS);
|
|
||||||
texture_range = gluCheckExtension ((const unsigned char *)"GL_APPLE_texture_range", strExt) ? GL_TRUE : GL_FALSE;
|
|
||||||
texture_hint = GL_STORAGE_SHARED_APPLE ;
|
|
||||||
client_storage = gluCheckExtension ((const unsigned char *)"GL_APPLE_client_storage", strExt) ? GL_TRUE : GL_FALSE;
|
|
||||||
rect_texture = gluCheckExtension((const unsigned char *)"GL_EXT_texture_rectangle", strExt) ? GL_TRUE : GL_FALSE;
|
|
||||||
|
|
||||||
// Setup some basic OpenGL stuff
|
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
|
||||||
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
|
||||||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
|
|
||||||
// Loads the shaders
|
|
||||||
|
|
||||||
if(isShaderEnabled()){
|
|
||||||
rect_texture = GL_FALSE;
|
|
||||||
// --- Params ---
|
|
||||||
shaderQuality = PSXShaderQuality();
|
|
||||||
vertexShader = [self loadShader:GL_VERTEX_SHADER location:PSXVertexShader()];
|
|
||||||
fragmentShader = [self loadShader:GL_FRAGMENT_SHADER location:PSXFragmentShader()];
|
|
||||||
|
|
||||||
//--- shader loading ---
|
|
||||||
program = glCreateProgram();
|
|
||||||
glAttachShader(program, vertexShader);
|
|
||||||
glAttachShader(program, fragmentShader);
|
|
||||||
glLinkProgram(program);
|
|
||||||
glUseProgram(program);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[NSOpenGLContext clearCurrentContext];
|
|
||||||
[glLock unlock];
|
|
||||||
|
|
||||||
image_width = 1024;
|
|
||||||
image_height = 512;
|
|
||||||
image_depth = 16;
|
|
||||||
|
|
||||||
image_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
|
|
||||||
image_base = (GLubyte *) calloc(((IMAGE_COUNT * image_width * image_height) / 3) * 4, image_depth >> 3);
|
|
||||||
if (image_base == nil) {
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create and load textures for the first time
|
|
||||||
[self loadTexturesGL2:GL_TRUE];
|
|
||||||
|
|
||||||
// Init fps timer
|
|
||||||
//gettimeofday(&cycle_time, NULL);
|
|
||||||
|
|
||||||
drawBG = YES;
|
|
||||||
|
|
||||||
// Call for a redisplay
|
|
||||||
noDisplay = YES;
|
|
||||||
PSXDisplay.Disabled = 1;
|
|
||||||
[self setNeedsDisplay:YES];
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)cleanupGL2
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
[glLock lock];
|
|
||||||
|
|
||||||
[[self openGLContext] makeCurrentContext];
|
|
||||||
for(i = 0; i < IMAGE_COUNT; i++)
|
|
||||||
{
|
|
||||||
GLuint dt = i+1;
|
|
||||||
glDeleteTextures(1, &dt);
|
|
||||||
}
|
|
||||||
if(texture_range)
|
|
||||||
glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, IMAGE_COUNT * image_width * image_height * (image_depth >> 3), image_base);
|
|
||||||
|
|
||||||
[NSOpenGLContext clearCurrentContext];
|
|
||||||
[glLock unlock];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)reshapeGL2
|
|
||||||
{
|
|
||||||
NSOpenGLContext *oglContext = [self openGLContext];
|
|
||||||
NSRect rect;
|
|
||||||
|
|
||||||
[oglContext makeCurrentContext];
|
|
||||||
[oglContext update];
|
|
||||||
|
|
||||||
rect = [[oglContext view] bounds];
|
|
||||||
|
|
||||||
glViewport(0, 0, (int) rect.size.width, (int) rect.size.height);
|
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
|
||||||
glLoadIdentity();
|
|
||||||
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
|
||||||
glLoadIdentity();
|
|
||||||
|
|
||||||
drawBG = YES;
|
|
||||||
|
|
||||||
[NSOpenGLContext clearCurrentContext];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)renderScreenGL2
|
|
||||||
{
|
|
||||||
int bufferIndex = whichImage;
|
|
||||||
|
|
||||||
if (1/*[glLock tryLock]*/) {
|
|
||||||
// Make this context current
|
|
||||||
[[self openGLContext] makeCurrentContext];
|
|
||||||
|
|
||||||
if (PSXDisplay.Disabled) {
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
} else {
|
|
||||||
// Bind, update and draw new image
|
|
||||||
if(rect_texture && isShaderEnabled() == NO) // cant go in there if we use shaders
|
|
||||||
{
|
|
||||||
//printf("Texture Rectangle\n");
|
|
||||||
//glActiveTexture(bufferIndex+1);
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
|
||||||
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, bufferIndex+1);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
glTexSubImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, image_width, image_height, GL_BGRA, image_type, image[bufferIndex]);
|
|
||||||
|
|
||||||
|
|
||||||
glBegin(GL_QUADS);
|
|
||||||
{
|
|
||||||
glTexCoord2f(0.0f, 0.0f);
|
|
||||||
glVertex2f(-1.0f, 1.0f);
|
|
||||||
|
|
||||||
glTexCoord2f(0.0f, image_height);
|
|
||||||
glVertex2f(-1.0f, -1.0f);
|
|
||||||
|
|
||||||
glTexCoord2f(image_width, image_height);
|
|
||||||
glVertex2f(1.0f, -1.0f);
|
|
||||||
|
|
||||||
glTexCoord2f(image_width, 0.0f);
|
|
||||||
glVertex2f(1.0f, 1.0f);
|
|
||||||
}
|
|
||||||
glEnd();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NSRect rect = [[[self openGLContext] view] bounds];
|
|
||||||
//printf("Texture 2D normale de taille : %d, %d sur un ecran : %f x %f \n",image_width,image_height,rect.size.width,rect.size.height);
|
|
||||||
//glActiveTexture(whichImage+1);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, whichImage+1);
|
|
||||||
|
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, image_width2, image_height2, GL_BGRA, image_type, image[bufferIndex]);
|
|
||||||
|
|
||||||
|
|
||||||
if(isShaderEnabled()){
|
|
||||||
glUseProgram(program);
|
|
||||||
|
|
||||||
int loc = glGetUniformLocation(program, "OGL2Texture");
|
|
||||||
glUniform1i(loc,0);
|
|
||||||
int loc2 = glGetUniformLocation(program, "OGL2Param");
|
|
||||||
float param[4];
|
|
||||||
param[2] = shaderQuality;
|
|
||||||
param[0] = param[2] / image_width;
|
|
||||||
param[1] = param[2] / image_height;
|
|
||||||
//param[2]=2.0;
|
|
||||||
param[3] = 0.0;
|
|
||||||
int loc3 = glGetUniformLocation(program, "OGL2Size");
|
|
||||||
float size[4];
|
|
||||||
//NSRect rect = [[[self openGLContext] view] bounds];
|
|
||||||
size[0] = image_width;
|
|
||||||
size[1] = image_height;
|
|
||||||
size[2] = rect.size.width;
|
|
||||||
size[3] = rect.size.height;
|
|
||||||
int loc4 = glGetUniformLocation(program, "OGL2InvSize");
|
|
||||||
float invSize[4];
|
|
||||||
invSize[0] = 1.0/size[0];
|
|
||||||
invSize[1] = 1.0/size[1];
|
|
||||||
invSize[2] = 1.0/size[2];
|
|
||||||
invSize[3] = 1.0/size[3];
|
|
||||||
//invSize[4]=1.0/size[4]; //Did we goof here?
|
|
||||||
glUniform4fv(loc2, 1, param);
|
|
||||||
glUniform4fv(loc3, 1, size);
|
|
||||||
glUniform4fv(loc4, 1, invSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
glBegin(GL_QUADS);
|
|
||||||
{
|
|
||||||
glTexCoord2f(0.0f, 0.0f);
|
|
||||||
glVertex2f(-1.0f, 1.0f);
|
|
||||||
|
|
||||||
glTexCoord2f(0.0f, image_ty);
|
|
||||||
glVertex2f(-1.0f, -1.0f);
|
|
||||||
|
|
||||||
glTexCoord2f(image_tx, image_ty);
|
|
||||||
glVertex2f(1.0f, -1.0f);
|
|
||||||
|
|
||||||
glTexCoord2f(image_tx, 0.0f);
|
|
||||||
glVertex2f(1.0f, 1.0f);
|
|
||||||
}
|
|
||||||
glEnd();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FPS Display
|
|
||||||
if(ulKeybits&KEY_SHOWFPS)
|
|
||||||
{
|
|
||||||
int len, i;
|
|
||||||
if(szDebugText[0] && ((time(NULL) - tStart) < 2))
|
|
||||||
{
|
|
||||||
strlcpy(szDispBuf, szDebugText, 63);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
szDebugText[0]=0;
|
|
||||||
if (szMenuBuf) {
|
|
||||||
strncat(szDispBuf, szMenuBuf, 63 - strlen(szDispBuf));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NSRect rect = [[[self openGLContext] view] bounds];
|
|
||||||
len = (int) strlen(szDispBuf);
|
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
|
||||||
glPushMatrix();
|
|
||||||
|
|
||||||
gluOrtho2D(0.0, rect.size.width, 0.0, rect.size.height);
|
|
||||||
glDisable(rect_texture ? GL_TEXTURE_RECTANGLE_EXT : GL_TEXTURE_2D);
|
|
||||||
|
|
||||||
glColor4f(0.0, 0.0, 0.0, 0.5);
|
|
||||||
glRasterPos2f(3.0, rect.size.height - 14.0);
|
|
||||||
for (i = 0; i < len; i++) {
|
|
||||||
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, szDispBuf[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
glColor3f(1.0, 1.0, 1.0);
|
|
||||||
glRasterPos2f(2.0, rect.size.height - 13.0);
|
|
||||||
for (i = 0; i < len; i++) {
|
|
||||||
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, szDispBuf[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
glEnable(rect_texture ? GL_TEXTURE_RECTANGLE_EXT : GL_TEXTURE_2D);
|
|
||||||
glPopMatrix();
|
|
||||||
}
|
|
||||||
|
|
||||||
//printProgramInfoLog(program);
|
|
||||||
//printf("\n\n\n");
|
|
||||||
[[self openGLContext] flushBuffer];
|
|
||||||
[NSOpenGLContext clearCurrentContext];
|
|
||||||
//[glLock unlock];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)loadTexturesGL2:(GLboolean)first
|
|
||||||
{
|
|
||||||
GLint i;
|
|
||||||
printf("Loading texture\n");
|
|
||||||
//[glLock lock];
|
|
||||||
[[self openGLContext] makeCurrentContext];
|
|
||||||
|
|
||||||
image_width = PreviousPSXDisplay.Range.x1;
|
|
||||||
image_height = PreviousPSXDisplay.DisplayMode.y;
|
|
||||||
if (PSXDisplay.RGB24) {
|
|
||||||
image_depth = 32;
|
|
||||||
image_type = GL_UNSIGNED_INT_8_8_8_8_REV;
|
|
||||||
} else {
|
|
||||||
image_depth = 16;
|
|
||||||
image_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
|
|
||||||
//image_width >>= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (image_width * image_height * (image_depth >> 3) > ((1024*512*2)/3)*4)
|
|
||||||
printf("Fatal error: desired dimension are too large! (%ix%i %ibpp)\n",
|
|
||||||
image_width, image_height, image_depth);
|
|
||||||
|
|
||||||
for(i = 0; i < IMAGE_COUNT; i++)
|
|
||||||
image[i] = image_base + i * image_width * image_height * (image_depth >> 3);
|
|
||||||
|
|
||||||
if(rect_texture)
|
|
||||||
{
|
|
||||||
image_width2 = image_width;
|
|
||||||
image_height2 = image_height;
|
|
||||||
image_tx = (float)image_width;
|
|
||||||
image_ty = (float)image_height;
|
|
||||||
|
|
||||||
if(texture_range) glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, IMAGE_COUNT * image_width * image_height * (image_depth >> 3), image_base);
|
|
||||||
else glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL);
|
|
||||||
|
|
||||||
for(i = 0; i < IMAGE_COUNT; i++)
|
|
||||||
{
|
|
||||||
if(!first)
|
|
||||||
{
|
|
||||||
GLuint dt = i+1;
|
|
||||||
glDeleteTextures(1, &dt);
|
|
||||||
}
|
|
||||||
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
|
||||||
glEnable(GL_TEXTURE_RECTANGLE_EXT);
|
|
||||||
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, i+1);
|
|
||||||
|
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , texture_hint);
|
|
||||||
glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, client_storage);
|
|
||||||
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
||||||
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, image_width,
|
|
||||||
image_height, 0, GL_BGRA, image_type, image[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
image_width2 = mylog2(image_width);
|
|
||||||
image_height2 = mylog2(image_height);
|
|
||||||
image_tx = (float)image_width/(float)image_width2;
|
|
||||||
image_ty = (float)image_height/(float)image_height2;
|
|
||||||
|
|
||||||
glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL);
|
|
||||||
if(texture_range) glTextureRangeAPPLE(GL_TEXTURE_2D, IMAGE_COUNT * image_width2 * image_height2 * (image_depth >> 3), image_base);
|
|
||||||
else glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL);
|
|
||||||
|
|
||||||
for(i = 0; i < IMAGE_COUNT; i++)
|
|
||||||
{
|
|
||||||
if(!first)
|
|
||||||
{
|
|
||||||
GLuint dt = i+1;
|
|
||||||
glDeleteTextures(1, &dt);
|
|
||||||
}
|
|
||||||
|
|
||||||
glDisable(GL_TEXTURE_RECTANGLE_EXT);
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, i+1);
|
|
||||||
|
|
||||||
//if(texture_range) glTextureRangeAPPLE(GL_TEXTURE_2D, IMAGE_COUNT * image_width2 * image_height2 * (image_depth >> 3), image_base);
|
|
||||||
//else glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL);
|
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , texture_hint);
|
|
||||||
glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, client_storage);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image_width2,
|
|
||||||
image_height2, 0, GL_BGRA, image_type, image[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[NSOpenGLContext clearCurrentContext];
|
|
||||||
//[glLock unlock];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
- (void)swapBufferGL2
|
|
||||||
{
|
|
||||||
|
|
||||||
//printf("y=%i",PSXDisplay.DisplayPosition.y);
|
|
||||||
|
|
||||||
unsigned char * surf;
|
|
||||||
long x = PSXDisplay.DisplayPosition.x;
|
|
||||||
long y = PSXDisplay.DisplayPosition.y;
|
|
||||||
GLuint lu;
|
|
||||||
unsigned short row,column;
|
|
||||||
unsigned short dx=PreviousPSXDisplay.Range.x1;
|
|
||||||
unsigned short dy=PreviousPSXDisplay.DisplayMode.y;
|
|
||||||
long lPitch;
|
|
||||||
|
|
||||||
if ([glLock tryLock]) {
|
|
||||||
// make sure the texture area is ready to be written to
|
|
||||||
glFinishObjectAPPLE(GL_TEXTURE, 2-whichImage);
|
|
||||||
|
|
||||||
if ((image_width != PreviousPSXDisplay.Range.x1) ||
|
|
||||||
(image_height != PreviousPSXDisplay.DisplayMode.y) ||
|
|
||||||
((PSXDisplay.RGB24 ? 32 : 16) != image_depth)) {
|
|
||||||
[self loadTexturesGL2:NO];
|
|
||||||
}
|
|
||||||
|
|
||||||
surf = image[1-whichImage];
|
|
||||||
lPitch=image_width2<<(image_depth >> 4);
|
|
||||||
|
|
||||||
if(PreviousPSXDisplay.Range.y0) // centering needed?
|
|
||||||
{
|
|
||||||
surf+=PreviousPSXDisplay.Range.y0*lPitch;
|
|
||||||
dy-=PreviousPSXDisplay.Range.y0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(PSXDisplay.RGB24)
|
|
||||||
{
|
|
||||||
unsigned char * pD;
|
|
||||||
size_t startxy;
|
|
||||||
|
|
||||||
surf+=PreviousPSXDisplay.Range.x0<<2;
|
|
||||||
|
|
||||||
for(column=0;column<dy;column++)
|
|
||||||
{
|
|
||||||
startxy = (1024 * (column + y)) + x;
|
|
||||||
pD = (unsigned char *)&psxVuw[startxy];
|
|
||||||
|
|
||||||
row = 0;
|
|
||||||
// make sure the reads are aligned
|
|
||||||
while ((intptr_t)pD & 0x3) {
|
|
||||||
*((unsigned long *)((surf)+(column*lPitch)+(row<<2))) =
|
|
||||||
(*(pD+0)<<16)|(*(pD+1)<<8)|*(pD+2);
|
|
||||||
|
|
||||||
pD+=3;
|
|
||||||
row++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(;row<dx;row+=4)
|
|
||||||
{
|
|
||||||
GLuint lu1 = *((GLuint *)pD);
|
|
||||||
GLuint lu2 = *((GLuint *)pD+1);
|
|
||||||
GLuint lu3 = *((GLuint *)pD+2);
|
|
||||||
GLuint *dst = ((GLuint *)((surf)+(column*lPitch)+(row<<2)));
|
|
||||||
#ifdef __BIG_ENDIAN__
|
|
||||||
*(dst)=
|
|
||||||
(((lu1>>24)&0xff)<<16)|(((lu1>>16)&0xff)<<8)|(((lu1>>8)&0xff));
|
|
||||||
*(dst+1)=
|
|
||||||
(((lu1>>0)&0xff)<<16)|(((lu2>>24)&0xff)<<8)|(((lu2>>16)&0xff));
|
|
||||||
*(dst+2)=
|
|
||||||
(((lu2>>8)&0xff)<<16)|(((lu2>>0)&0xff)<<8)|(((lu3>>24)&0xff));
|
|
||||||
*(dst+3)=
|
|
||||||
(((lu3>>16)&0xff)<<16)|(((lu3>>8)&0xff)<<8)|(((lu3>>0)&0xff));
|
|
||||||
#else
|
|
||||||
*(dst)=
|
|
||||||
(((lu1>>0)&0xff)<<16)|(((lu1>>8)&0xff)<<8)|(((lu1>>16)&0xff));
|
|
||||||
*(dst+1)=
|
|
||||||
(((lu1>>24)&0xff)<<16)|(((lu2>>0)&0xff)<<8)|(((lu2>>8)&0xff));
|
|
||||||
*(dst+2)=
|
|
||||||
(((lu2>>16)&0xff)<<16)|(((lu2>>24)&0xff)<<8)|(((lu3>>0)&0xff));
|
|
||||||
*(dst+3)=
|
|
||||||
(((lu3>>8)&0xff)<<16)|(((lu3>>16)&0xff)<<8)|(((lu3>>24)&0xff));
|
|
||||||
#endif
|
|
||||||
pD+=12;
|
|
||||||
}
|
|
||||||
|
|
||||||
//for(;row<dx;row+=4)
|
|
||||||
/*while (pD&0x3) {
|
|
||||||
*((unsigned long *)((surf)+(column*lPitch)+(row<<2)))=
|
|
||||||
(*(pD+0)<<16)|(*(pD+1)<<8)|(*(pD+2)&0xff));
|
|
||||||
pD+=3;
|
|
||||||
row++;
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
long LineOffset,SurfOffset;
|
|
||||||
GLuint * SRCPtr = (GLuint *)(psxVuw + (y << 10) + x);
|
|
||||||
GLuint * DSTPtr =
|
|
||||||
((GLuint *)surf) + (PreviousPSXDisplay.Range.x0 >> 1);
|
|
||||||
|
|
||||||
dx >>= 1;
|
|
||||||
|
|
||||||
LineOffset = 512 - dx;
|
|
||||||
SurfOffset = (lPitch >> 2) - dx;
|
|
||||||
|
|
||||||
for(column=0;column<dy;column++)
|
|
||||||
{
|
|
||||||
for(row=0;row<dx;row++)
|
|
||||||
{
|
|
||||||
#ifdef __BIG_ENDIAN__
|
|
||||||
lu=GETLE16D(SRCPtr++);
|
|
||||||
#else
|
|
||||||
lu=*SRCPtr++;
|
|
||||||
#endif
|
|
||||||
*DSTPtr++=
|
|
||||||
((lu << 10) & 0x7c007c00)|
|
|
||||||
((lu) & 0x3e003e0)|
|
|
||||||
((lu >> 10) & 0x1f001f);
|
|
||||||
}
|
|
||||||
SRCPtr += LineOffset;
|
|
||||||
DSTPtr += SurfOffset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap image buffer
|
|
||||||
whichImage = 1 - whichImage;
|
|
||||||
|
|
||||||
[self renderScreenGL2];
|
|
||||||
[glLock unlock];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@end
|
|
|
@ -1,188 +0,0 @@
|
||||||
//
|
|
||||||
// GL3Code.m
|
|
||||||
// Pcsxr
|
|
||||||
//
|
|
||||||
// Created by C.W. Betts on 11/26/13.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
|
||||||
#include <OpenGL/gl3.h>
|
|
||||||
#include <OpenGL/gl3ext.h>
|
|
||||||
#import <GLKit/GLKit.h>
|
|
||||||
#import "PluginGLView.h"
|
|
||||||
#import "SGPUPreferences.h"
|
|
||||||
#include "externals.h"
|
|
||||||
#undef BOOL
|
|
||||||
#include "gpu.h"
|
|
||||||
#include "swap.h"
|
|
||||||
|
|
||||||
static int mylog2(int val)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i=1; i<31; i++)
|
|
||||||
if (val <= (1 << i))
|
|
||||||
return (1 << i);
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@implementation PluginGLView (GL3)
|
|
||||||
|
|
||||||
- (BOOL)setupOpenGL3
|
|
||||||
{
|
|
||||||
static const NSOpenGLPixelFormatAttribute attrs[] =
|
|
||||||
{
|
|
||||||
NSOpenGLPFAAccelerated,
|
|
||||||
NSOpenGLPFANoRecovery,
|
|
||||||
NSOpenGLPFADoubleBuffer,
|
|
||||||
NSOpenGLPFAOpenGLProfile,
|
|
||||||
NSOpenGLProfileVersion3_2Core,
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
// Get pixel format from OpenGL
|
|
||||||
NSOpenGLPixelFormat* pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
|
|
||||||
if (!pixFmt) {
|
|
||||||
NSLog(@"OpenGL 3 context could not be created.");
|
|
||||||
NSLog(@"Legacy context will be tried.");
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
[self setPixelFormat:pixFmt];
|
|
||||||
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)cleanupGL3
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)reshapeGL3
|
|
||||||
{
|
|
||||||
NSOpenGLContext *oglContext = [self openGLContext];
|
|
||||||
NSRect rect;
|
|
||||||
|
|
||||||
[oglContext makeCurrentContext];
|
|
||||||
[oglContext update];
|
|
||||||
|
|
||||||
rect = [[oglContext view] bounds];
|
|
||||||
|
|
||||||
glViewport(0, 0, (int) rect.size.width, (int) rect.size.height);
|
|
||||||
|
|
||||||
//glMatrixMode(GL_PROJECTION);
|
|
||||||
//glLoadIdentity();
|
|
||||||
|
|
||||||
//glMatrixMode(GL_MODELVIEW);
|
|
||||||
//glLoadIdentity();
|
|
||||||
|
|
||||||
drawBG = YES;
|
|
||||||
|
|
||||||
[NSOpenGLContext clearCurrentContext];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)renderScreenGL3
|
|
||||||
{
|
|
||||||
NSRect rect = [[[self openGLContext] view] bounds];
|
|
||||||
|
|
||||||
GLKMatrix4 matrix = GLKMatrix4MakeOrtho(0, rect.size.width, 0, rect.size.height, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)loadTexturesGL3:(GLboolean)first
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)swapBufferGL3
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
- (GLuint)loadShader:(GLenum)type location:(NSURL*)filename
|
|
||||||
{
|
|
||||||
GLuint myShader = 0;
|
|
||||||
|
|
||||||
GLsizei logsize = 0;
|
|
||||||
GLint compile_status = GL_TRUE;
|
|
||||||
char *log = NULL;
|
|
||||||
char *src = NULL;
|
|
||||||
|
|
||||||
/* creation d'un shader de sommet */
|
|
||||||
myShader = glCreateShader(type);
|
|
||||||
if(myShader == 0)
|
|
||||||
{
|
|
||||||
NSLog(@"impossible de creer le shader");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* chargement du code source */
|
|
||||||
src = [PluginGLView loadSource:filename];
|
|
||||||
if(src == NULL)
|
|
||||||
{
|
|
||||||
/* theoriquement, la fonction LoadSource a deja affiche un message
|
|
||||||
d'erreur, nous nous contenterons de supprimer notre shader
|
|
||||||
et de retourner 0 */
|
|
||||||
|
|
||||||
glDeleteShader(myShader);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* assignation du code source */
|
|
||||||
glShaderSource(myShader, 1, (const GLchar**)&src, NULL);
|
|
||||||
|
|
||||||
/* compilation du shader */
|
|
||||||
glCompileShader(myShader);
|
|
||||||
|
|
||||||
/* liberation de la memoire du code source */
|
|
||||||
free(src);
|
|
||||||
src = NULL;
|
|
||||||
|
|
||||||
/* verification du succes de la compilation */
|
|
||||||
glGetShaderiv(myShader, GL_COMPILE_STATUS, &compile_status);
|
|
||||||
if(compile_status != GL_TRUE)
|
|
||||||
{
|
|
||||||
/* erreur a la compilation recuperation du log d'erreur */
|
|
||||||
|
|
||||||
/* on recupere la taille du message d'erreur */
|
|
||||||
glGetShaderiv(myShader, GL_INFO_LOG_LENGTH, &logsize);
|
|
||||||
|
|
||||||
/* on alloue un espace memoire dans lequel OpenGL ecrira le message */
|
|
||||||
log = calloc(logsize + 1, 1);
|
|
||||||
if(log == NULL)
|
|
||||||
{
|
|
||||||
NSLog(@"impossible d'allouer de la memoire!");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
glGetShaderInfoLog(myShader, logsize, &logsize, log);
|
|
||||||
NSLog(@"impossible de compiler le shader '%@' :\n%s",
|
|
||||||
[filename path], log);
|
|
||||||
|
|
||||||
/* ne pas oublier de liberer la memoire et notre shader */
|
|
||||||
free(log);
|
|
||||||
glDeleteShader(myShader);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return myShader;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
void printProgramInfoLog(GLuint obj)
|
|
||||||
{
|
|
||||||
int infologLength = 0;
|
|
||||||
int charsWritten = 0;
|
|
||||||
char *infoLog;
|
|
||||||
|
|
||||||
glGetProgramiv(obj, GL_INFO_LOG_LENGTH, &infologLength);
|
|
||||||
|
|
||||||
if (infologLength > 0)
|
|
||||||
{
|
|
||||||
infoLog = (char *)malloc(infologLength);
|
|
||||||
glGetProgramInfoLog(obj, infologLength, &charsWritten, infoLog);
|
|
||||||
NSLog(@"%s", infoLog);
|
|
||||||
free(infoLog);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -43,29 +43,6 @@ static inline void RunOnMainThreadSync(dispatch_block_t block)
|
||||||
- (void)loadTextures:(GLboolean)first;
|
- (void)loadTextures:(GLboolean)first;
|
||||||
+ (char*)loadSource:(NSURL *)filename;
|
+ (char*)loadSource:(NSURL *)filename;
|
||||||
void printProgramInfoLog(GLuint obj);
|
void printProgramInfoLog(GLuint obj);
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@interface PluginGLView (GL2)
|
|
||||||
|
|
||||||
- (BOOL)setupOpenGL2;
|
|
||||||
- (void)cleanupGL2;
|
|
||||||
- (void)reshapeGL2;
|
|
||||||
- (void)renderScreenGL2;
|
|
||||||
- (void)loadTexturesGL2:(GLboolean)first;
|
|
||||||
- (void)swapBufferGL2;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@interface PluginGLView (GL3)
|
|
||||||
|
|
||||||
- (BOOL)setupOpenGL3;
|
|
||||||
- (void)cleanupGL3;
|
|
||||||
- (void)reshapeGL3;
|
|
||||||
- (void)renderScreenGL3;
|
|
||||||
- (void)loadTexturesGL3:(GLboolean)first;
|
|
||||||
- (void)swapBufferGL3;
|
|
||||||
- (GLuint)loadShader:(GLenum)type location:(NSURL*)filename;
|
- (GLuint)loadShader:(GLenum)type location:(NSURL*)filename;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,11 @@
|
||||||
* *
|
* *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#include <OpenGL/gl.h>
|
||||||
|
#include <OpenGL/glext.h>
|
||||||
|
#include <OpenGL/glu.h>
|
||||||
|
#include <GLUT/glut.h>
|
||||||
#import "PluginGLView.h"
|
#import "PluginGLView.h"
|
||||||
#import "SGPUPreferences.h"
|
#import "SGPUPreferences.h"
|
||||||
#include "externals.h"
|
#include "externals.h"
|
||||||
|
@ -26,6 +31,17 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
extern time_t tStart;
|
extern time_t tStart;
|
||||||
|
|
||||||
|
static int mylog2(int val)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i=1; i<31; i++)
|
||||||
|
if (val <= (1 << i))
|
||||||
|
return (1 << i);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@implementation PluginGLView
|
@implementation PluginGLView
|
||||||
{
|
{
|
||||||
GLubyte *image_base;
|
GLubyte *image_base;
|
||||||
|
@ -59,7 +75,6 @@ extern time_t tStart;
|
||||||
float image_ty;
|
float image_ty;
|
||||||
int whichImage;
|
int whichImage;
|
||||||
BOOL isFullscreen;
|
BOOL isFullscreen;
|
||||||
NSOpenGLPixelFormatAttribute oglProfile;
|
|
||||||
}
|
}
|
||||||
@synthesize glLock;
|
@synthesize glLock;
|
||||||
|
|
||||||
|
@ -74,23 +89,127 @@ extern time_t tStart;
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([self setupOpenGL3]) {
|
const GLubyte * strExt;
|
||||||
oglProfile = NSOpenGLProfileVersion3_2Core;
|
|
||||||
} else if ([self setupOpenGL2]) {
|
// Init pixel format attribs
|
||||||
oglProfile = NSOpenGLProfileVersionLegacy;
|
static const NSOpenGLPixelFormatAttribute attrs[] =
|
||||||
} else
|
{
|
||||||
|
NSOpenGLPFAAccelerated,
|
||||||
|
NSOpenGLPFANoRecovery,
|
||||||
|
NSOpenGLPFADoubleBuffer,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get pixel format from OpenGL
|
||||||
|
NSOpenGLPixelFormat* pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
|
||||||
|
if (!pixFmt)
|
||||||
|
{
|
||||||
|
NSLog(@"No Accelerated OpenGL pixel format found\n");
|
||||||
|
|
||||||
|
static const NSOpenGLPixelFormatAttribute attrs2[] =
|
||||||
|
{
|
||||||
|
NSOpenGLPFANoRecovery,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get pixel format from OpenGL
|
||||||
|
pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs2];
|
||||||
|
if (!pixFmt) {
|
||||||
|
NSLog(@"No OpenGL pixel format found!\n");
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[self setPixelFormat:pixFmt];
|
||||||
|
|
||||||
|
/*
|
||||||
|
long swapInterval = 1 ;
|
||||||
|
[[self openGLContext]
|
||||||
|
setValues:&swapInterval
|
||||||
|
forParameter:NSOpenGLCPSwapInterval];
|
||||||
|
*/
|
||||||
|
[glLock lock];
|
||||||
|
[[self openGLContext] makeCurrentContext];
|
||||||
|
|
||||||
|
// Init object members
|
||||||
|
strExt = glGetString (GL_EXTENSIONS);
|
||||||
|
texture_range = gluCheckExtension ((const unsigned char *)"GL_APPLE_texture_range", strExt) ? GL_TRUE : GL_FALSE;
|
||||||
|
texture_hint = GL_STORAGE_SHARED_APPLE ;
|
||||||
|
client_storage = gluCheckExtension ((const unsigned char *)"GL_APPLE_client_storage", strExt) ? GL_TRUE : GL_FALSE;
|
||||||
|
rect_texture = gluCheckExtension((const unsigned char *)"GL_EXT_texture_rectangle", strExt) ? GL_TRUE : GL_FALSE;
|
||||||
|
|
||||||
|
// Setup some basic OpenGL stuff
|
||||||
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
||||||
|
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
|
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
// Loads the shaders
|
||||||
|
|
||||||
|
if(isShaderEnabled()){
|
||||||
|
rect_texture = GL_FALSE;
|
||||||
|
// --- Params ---
|
||||||
|
shaderQuality = PSXShaderQuality();
|
||||||
|
vertexShader = [self loadShader:GL_VERTEX_SHADER location:PSXVertexShader()];
|
||||||
|
fragmentShader = [self loadShader:GL_FRAGMENT_SHADER location:PSXFragmentShader()];
|
||||||
|
|
||||||
|
//--- shader loading ---
|
||||||
|
program = glCreateProgram();
|
||||||
|
glAttachShader(program, vertexShader);
|
||||||
|
glAttachShader(program, fragmentShader);
|
||||||
|
glLinkProgram(program);
|
||||||
|
glUseProgram(program);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[NSOpenGLContext clearCurrentContext];
|
||||||
|
[glLock unlock];
|
||||||
|
|
||||||
|
image_width = 1024;
|
||||||
|
image_height = 512;
|
||||||
|
image_depth = 16;
|
||||||
|
|
||||||
|
image_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
|
||||||
|
image_base = (GLubyte *) calloc(((IMAGE_COUNT * image_width * image_height) / 3) * 4, image_depth >> 3);
|
||||||
|
if (image_base == nil) {
|
||||||
return nil;
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create and load textures for the first time
|
||||||
|
[self loadTextures:GL_TRUE];
|
||||||
|
|
||||||
|
// Init fps timer
|
||||||
|
//gettimeofday(&cycle_time, NULL);
|
||||||
|
|
||||||
|
drawBG = YES;
|
||||||
|
|
||||||
|
// Call for a redisplay
|
||||||
|
noDisplay = YES;
|
||||||
|
PSXDisplay.Disabled = 1;
|
||||||
|
[self setNeedsDisplay:YES];
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)dealloc
|
- (void)dealloc
|
||||||
{
|
{
|
||||||
if (oglProfile == NSOpenGLProfileVersionLegacy) {
|
int i;
|
||||||
[self cleanupGL2];
|
|
||||||
} else if (oglProfile == NSOpenGLProfileVersion3_2Core) {
|
[glLock lock];
|
||||||
[self cleanupGL3];
|
|
||||||
|
[[self openGLContext] makeCurrentContext];
|
||||||
|
for(i = 0; i < IMAGE_COUNT; i++)
|
||||||
|
{
|
||||||
|
GLuint dt = i+1;
|
||||||
|
glDeleteTextures(1, &dt);
|
||||||
}
|
}
|
||||||
|
if(texture_range)
|
||||||
|
glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, IMAGE_COUNT * image_width * image_height * (image_depth >> 3), image_base);
|
||||||
|
|
||||||
|
[NSOpenGLContext clearCurrentContext];
|
||||||
|
[glLock unlock];
|
||||||
|
|
||||||
if (image_base) {
|
if (image_base) {
|
||||||
free(image_base);
|
free(image_base);
|
||||||
|
@ -156,48 +275,412 @@ extern time_t tStart;
|
||||||
|
|
||||||
[super reshape];
|
[super reshape];
|
||||||
|
|
||||||
if (oglProfile == NSOpenGLProfileVersionLegacy) {
|
NSOpenGLContext *oglContext = [self openGLContext];
|
||||||
[self reshapeGL2];
|
NSRect rect;
|
||||||
[self renderScreenGL2];
|
|
||||||
} else if (oglProfile == NSOpenGLProfileVersion3_2Core) {
|
|
||||||
[self reshapeGL3];
|
|
||||||
[self renderScreenGL3];
|
|
||||||
}
|
|
||||||
|
|
||||||
//[self setNeedsDisplay:true];
|
[oglContext makeCurrentContext];
|
||||||
|
[oglContext update];
|
||||||
|
|
||||||
|
rect = [[oglContext view] bounds];
|
||||||
|
|
||||||
|
glViewport(0, 0, (int) rect.size.width, (int) rect.size.height);
|
||||||
|
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glLoadIdentity();
|
||||||
|
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glLoadIdentity();
|
||||||
|
|
||||||
|
drawBG = YES;
|
||||||
|
|
||||||
|
[NSOpenGLContext clearCurrentContext];
|
||||||
|
|
||||||
|
[self setNeedsDisplay:true];
|
||||||
|
|
||||||
[glLock unlock];
|
[glLock unlock];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)renderScreen
|
- (void)renderScreen
|
||||||
{
|
{
|
||||||
if (oglProfile == NSOpenGLProfileVersionLegacy) {
|
int bufferIndex = whichImage;
|
||||||
[self renderScreenGL2];
|
|
||||||
} else if (oglProfile == NSOpenGLProfileVersion3_2Core) {
|
if (1/*[glLock tryLock]*/) {
|
||||||
[self renderScreenGL3];
|
// Make this context current
|
||||||
|
[[self openGLContext] makeCurrentContext];
|
||||||
|
|
||||||
|
if (PSXDisplay.Disabled) {
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
} else {
|
||||||
|
// Bind, update and draw new image
|
||||||
|
if(rect_texture && isShaderEnabled() == NO) // cant go in there if we use shaders
|
||||||
|
{
|
||||||
|
//printf("Texture Rectangle\n");
|
||||||
|
//glActiveTexture(bufferIndex+1);
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, bufferIndex+1);
|
||||||
|
|
||||||
|
glTexSubImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, image_width, image_height, GL_BGRA, image_type, image[bufferIndex]);
|
||||||
|
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
{
|
||||||
|
glTexCoord2f(0.0f, 0.0f);
|
||||||
|
glVertex2f(-1.0f, 1.0f);
|
||||||
|
|
||||||
|
glTexCoord2f(0.0f, image_height);
|
||||||
|
glVertex2f(-1.0f, -1.0f);
|
||||||
|
|
||||||
|
glTexCoord2f(image_width, image_height);
|
||||||
|
glVertex2f(1.0f, -1.0f);
|
||||||
|
|
||||||
|
glTexCoord2f(image_width, 0.0f);
|
||||||
|
glVertex2f(1.0f, 1.0f);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSRect rect = [[[self openGLContext] view] bounds];
|
||||||
|
//printf("Texture 2D normale de taille : %d, %d sur un ecran : %f x %f \n",image_width,image_height,rect.size.width,rect.size.height);
|
||||||
|
//glActiveTexture(whichImage+1);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, whichImage+1);
|
||||||
|
|
||||||
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, image_width2, image_height2, GL_BGRA, image_type, image[bufferIndex]);
|
||||||
|
|
||||||
|
|
||||||
|
if(isShaderEnabled()){
|
||||||
|
glUseProgram(program);
|
||||||
|
|
||||||
|
int loc = glGetUniformLocation(program, "OGL2Texture");
|
||||||
|
glUniform1i(loc,0);
|
||||||
|
int loc2 = glGetUniformLocation(program, "OGL2Param");
|
||||||
|
float param[4];
|
||||||
|
param[2] = shaderQuality;
|
||||||
|
param[0] = param[2] / image_width;
|
||||||
|
param[1] = param[2] / image_height;
|
||||||
|
//param[2]=2.0;
|
||||||
|
param[3] = 0.0;
|
||||||
|
int loc3 = glGetUniformLocation(program, "OGL2Size");
|
||||||
|
float size[4];
|
||||||
|
//NSRect rect = [[[self openGLContext] view] bounds];
|
||||||
|
size[0] = image_width;
|
||||||
|
size[1] = image_height;
|
||||||
|
size[2] = rect.size.width;
|
||||||
|
size[3] = rect.size.height;
|
||||||
|
int loc4 = glGetUniformLocation(program, "OGL2InvSize");
|
||||||
|
float invSize[4];
|
||||||
|
invSize[0] = 1.0/size[0];
|
||||||
|
invSize[1] = 1.0/size[1];
|
||||||
|
invSize[2] = 1.0/size[2];
|
||||||
|
invSize[3] = 1.0/size[3];
|
||||||
|
//invSize[4]=1.0/size[4]; //Did we goof here?
|
||||||
|
glUniform4fv(loc2, 1, param);
|
||||||
|
glUniform4fv(loc3, 1, size);
|
||||||
|
glUniform4fv(loc4, 1, invSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
{
|
||||||
|
glTexCoord2f(0.0f, 0.0f);
|
||||||
|
glVertex2f(-1.0f, 1.0f);
|
||||||
|
|
||||||
|
glTexCoord2f(0.0f, image_ty);
|
||||||
|
glVertex2f(-1.0f, -1.0f);
|
||||||
|
|
||||||
|
glTexCoord2f(image_tx, image_ty);
|
||||||
|
glVertex2f(1.0f, -1.0f);
|
||||||
|
|
||||||
|
glTexCoord2f(image_tx, 0.0f);
|
||||||
|
glVertex2f(1.0f, 1.0f);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FPS Display
|
||||||
|
if(ulKeybits&KEY_SHOWFPS)
|
||||||
|
{
|
||||||
|
int len, i;
|
||||||
|
if(szDebugText[0] && ((time(NULL) - tStart) < 2))
|
||||||
|
{
|
||||||
|
strlcpy(szDispBuf, szDebugText, 63);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
szDebugText[0]=0;
|
||||||
|
if (szMenuBuf) {
|
||||||
|
strncat(szDispBuf, szMenuBuf, 63 - strlen(szDispBuf));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NSRect rect = [[[self openGLContext] view] bounds];
|
||||||
|
len = (int) strlen(szDispBuf);
|
||||||
|
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
gluOrtho2D(0.0, rect.size.width, 0.0, rect.size.height);
|
||||||
|
glDisable(rect_texture ? GL_TEXTURE_RECTANGLE_EXT : GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
glColor4f(0.0, 0.0, 0.0, 0.5);
|
||||||
|
glRasterPos2f(3.0, rect.size.height - 14.0);
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, szDispBuf[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
glColor3f(1.0, 1.0, 1.0);
|
||||||
|
glRasterPos2f(2.0, rect.size.height - 13.0);
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, szDispBuf[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
glEnable(rect_texture ? GL_TEXTURE_RECTANGLE_EXT : GL_TEXTURE_2D);
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
//printProgramInfoLog(program);
|
||||||
|
//printf("\n\n\n");
|
||||||
|
[[self openGLContext] flushBuffer];
|
||||||
|
[NSOpenGLContext clearCurrentContext];
|
||||||
|
//[glLock unlock];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)loadTextures:(GLboolean)first
|
- (void)loadTextures:(GLboolean)first
|
||||||
{
|
{
|
||||||
if (oglProfile == NSOpenGLProfileVersionLegacy) {
|
GLint i;
|
||||||
[self loadTexturesGL2:first];
|
printf("Loading texture\n");
|
||||||
} else if (oglProfile == NSOpenGLProfileVersion3_2Core) {
|
//[glLock lock];
|
||||||
[self loadTexturesGL3:first];
|
[[self openGLContext] makeCurrentContext];
|
||||||
|
|
||||||
|
image_width = PreviousPSXDisplay.Range.x1;
|
||||||
|
image_height = PreviousPSXDisplay.DisplayMode.y;
|
||||||
|
if (PSXDisplay.RGB24) {
|
||||||
|
image_depth = 32;
|
||||||
|
image_type = GL_UNSIGNED_INT_8_8_8_8_REV;
|
||||||
|
} else {
|
||||||
|
image_depth = 16;
|
||||||
|
image_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
|
||||||
|
//image_width >>= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (image_width * image_height * (image_depth >> 3) > ((1024*512*2)/3)*4)
|
||||||
|
printf("Fatal error: desired dimension are too large! (%ix%i %ibpp)\n",
|
||||||
|
image_width, image_height, image_depth);
|
||||||
|
|
||||||
|
for(i = 0; i < IMAGE_COUNT; i++)
|
||||||
|
image[i] = image_base + i * image_width * image_height * (image_depth >> 3);
|
||||||
|
|
||||||
|
if(rect_texture)
|
||||||
|
{
|
||||||
|
image_width2 = image_width;
|
||||||
|
image_height2 = image_height;
|
||||||
|
image_tx = (float)image_width;
|
||||||
|
image_ty = (float)image_height;
|
||||||
|
|
||||||
|
if(texture_range) glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, IMAGE_COUNT * image_width * image_height * (image_depth >> 3), image_base);
|
||||||
|
else glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL);
|
||||||
|
|
||||||
|
for(i = 0; i < IMAGE_COUNT; i++)
|
||||||
|
{
|
||||||
|
if(!first)
|
||||||
|
{
|
||||||
|
GLuint dt = i+1;
|
||||||
|
glDeleteTextures(1, &dt);
|
||||||
|
}
|
||||||
|
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glEnable(GL_TEXTURE_RECTANGLE_EXT);
|
||||||
|
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, i+1);
|
||||||
|
|
||||||
|
|
||||||
|
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , texture_hint);
|
||||||
|
glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, client_storage);
|
||||||
|
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||||
|
|
||||||
|
glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, image_width,
|
||||||
|
image_height, 0, GL_BGRA, image_type, image[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
image_width2 = mylog2(image_width);
|
||||||
|
image_height2 = mylog2(image_height);
|
||||||
|
image_tx = (float)image_width/(float)image_width2;
|
||||||
|
image_ty = (float)image_height/(float)image_height2;
|
||||||
|
|
||||||
|
glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL);
|
||||||
|
if(texture_range) glTextureRangeAPPLE(GL_TEXTURE_2D, IMAGE_COUNT * image_width2 * image_height2 * (image_depth >> 3), image_base);
|
||||||
|
else glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL);
|
||||||
|
|
||||||
|
for(i = 0; i < IMAGE_COUNT; i++)
|
||||||
|
{
|
||||||
|
if(!first)
|
||||||
|
{
|
||||||
|
GLuint dt = i+1;
|
||||||
|
glDeleteTextures(1, &dt);
|
||||||
|
}
|
||||||
|
|
||||||
|
glDisable(GL_TEXTURE_RECTANGLE_EXT);
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, i+1);
|
||||||
|
|
||||||
|
//if(texture_range) glTextureRangeAPPLE(GL_TEXTURE_2D, IMAGE_COUNT * image_width2 * image_height2 * (image_depth >> 3), image_base);
|
||||||
|
//else glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL);
|
||||||
|
|
||||||
|
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , texture_hint);
|
||||||
|
glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, client_storage);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||||
|
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image_width2,
|
||||||
|
image_height2, 0, GL_BGRA, image_type, image[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[NSOpenGLContext clearCurrentContext];
|
||||||
|
//[glLock unlock];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)swapBuffer
|
- (void)swapBuffer
|
||||||
{
|
{
|
||||||
if (oglProfile == NSOpenGLProfileVersionLegacy) {
|
RunOnMainThreadSync(^{
|
||||||
RunOnMainThreadSync(^{
|
//printf("y=%i",PSXDisplay.DisplayPosition.y);
|
||||||
[self swapBufferGL2];
|
|
||||||
});
|
unsigned char * surf;
|
||||||
} else if (oglProfile == NSOpenGLProfileVersion3_2Core) {
|
long x = PSXDisplay.DisplayPosition.x;
|
||||||
RunOnMainThreadSync(^{
|
long y = PSXDisplay.DisplayPosition.y;
|
||||||
[self swapBufferGL3];
|
GLuint lu;
|
||||||
});
|
unsigned short row,column;
|
||||||
}
|
unsigned short dx=PreviousPSXDisplay.Range.x1;
|
||||||
|
unsigned short dy=PreviousPSXDisplay.DisplayMode.y;
|
||||||
|
long lPitch;
|
||||||
|
|
||||||
|
if ([glLock tryLock]) {
|
||||||
|
// make sure the texture area is ready to be written to
|
||||||
|
glFinishObjectAPPLE(GL_TEXTURE, 2-whichImage);
|
||||||
|
|
||||||
|
if ((image_width != PreviousPSXDisplay.Range.x1) ||
|
||||||
|
(image_height != PreviousPSXDisplay.DisplayMode.y) ||
|
||||||
|
((PSXDisplay.RGB24 ? 32 : 16) != image_depth)) {
|
||||||
|
[self loadTextures:GL_FALSE];
|
||||||
|
}
|
||||||
|
|
||||||
|
surf = image[1-whichImage];
|
||||||
|
lPitch=image_width2<<(image_depth >> 4);
|
||||||
|
|
||||||
|
if(PreviousPSXDisplay.Range.y0) // centering needed?
|
||||||
|
{
|
||||||
|
surf+=PreviousPSXDisplay.Range.y0*lPitch;
|
||||||
|
dy-=PreviousPSXDisplay.Range.y0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(PSXDisplay.RGB24)
|
||||||
|
{
|
||||||
|
unsigned char * pD;
|
||||||
|
size_t startxy;
|
||||||
|
|
||||||
|
surf+=PreviousPSXDisplay.Range.x0<<2;
|
||||||
|
|
||||||
|
for(column=0;column<dy;column++)
|
||||||
|
{
|
||||||
|
startxy = (1024 * (column + y)) + x;
|
||||||
|
pD = (unsigned char *)&psxVuw[startxy];
|
||||||
|
|
||||||
|
row = 0;
|
||||||
|
// make sure the reads are aligned
|
||||||
|
while ((intptr_t)pD & 0x3) {
|
||||||
|
*((unsigned long *)((surf)+(column*lPitch)+(row<<2))) =
|
||||||
|
(*(pD+0)<<16)|(*(pD+1)<<8)|*(pD+2);
|
||||||
|
|
||||||
|
pD+=3;
|
||||||
|
row++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(;row<dx;row+=4)
|
||||||
|
{
|
||||||
|
GLuint lu1 = *((GLuint *)pD);
|
||||||
|
GLuint lu2 = *((GLuint *)pD+1);
|
||||||
|
GLuint lu3 = *((GLuint *)pD+2);
|
||||||
|
GLuint *dst = ((GLuint *)((surf)+(column*lPitch)+(row<<2)));
|
||||||
|
#ifdef __BIG_ENDIAN__
|
||||||
|
*(dst)=
|
||||||
|
(((lu1>>24)&0xff)<<16)|(((lu1>>16)&0xff)<<8)|(((lu1>>8)&0xff));
|
||||||
|
*(dst+1)=
|
||||||
|
(((lu1>>0)&0xff)<<16)|(((lu2>>24)&0xff)<<8)|(((lu2>>16)&0xff));
|
||||||
|
*(dst+2)=
|
||||||
|
(((lu2>>8)&0xff)<<16)|(((lu2>>0)&0xff)<<8)|(((lu3>>24)&0xff));
|
||||||
|
*(dst+3)=
|
||||||
|
(((lu3>>16)&0xff)<<16)|(((lu3>>8)&0xff)<<8)|(((lu3>>0)&0xff));
|
||||||
|
#else
|
||||||
|
*(dst)=
|
||||||
|
(((lu1>>0)&0xff)<<16)|(((lu1>>8)&0xff)<<8)|(((lu1>>16)&0xff));
|
||||||
|
*(dst+1)=
|
||||||
|
(((lu1>>24)&0xff)<<16)|(((lu2>>0)&0xff)<<8)|(((lu2>>8)&0xff));
|
||||||
|
*(dst+2)=
|
||||||
|
(((lu2>>16)&0xff)<<16)|(((lu2>>24)&0xff)<<8)|(((lu3>>0)&0xff));
|
||||||
|
*(dst+3)=
|
||||||
|
(((lu3>>8)&0xff)<<16)|(((lu3>>16)&0xff)<<8)|(((lu3>>24)&0xff));
|
||||||
|
#endif
|
||||||
|
pD+=12;
|
||||||
|
}
|
||||||
|
|
||||||
|
//for(;row<dx;row+=4)
|
||||||
|
/*while (pD&0x3) {
|
||||||
|
*((unsigned long *)((surf)+(column*lPitch)+(row<<2)))=
|
||||||
|
(*(pD+0)<<16)|(*(pD+1)<<8)|(*(pD+2)&0xff));
|
||||||
|
pD+=3;
|
||||||
|
row++;
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
long LineOffset,SurfOffset;
|
||||||
|
GLuint * SRCPtr = (GLuint *)(psxVuw + (y << 10) + x);
|
||||||
|
GLuint * DSTPtr =
|
||||||
|
((GLuint *)surf) + (PreviousPSXDisplay.Range.x0 >> 1);
|
||||||
|
|
||||||
|
dx >>= 1;
|
||||||
|
|
||||||
|
LineOffset = 512 - dx;
|
||||||
|
SurfOffset = (lPitch >> 2) - dx;
|
||||||
|
|
||||||
|
for(column=0;column<dy;column++)
|
||||||
|
{
|
||||||
|
for(row=0;row<dx;row++)
|
||||||
|
{
|
||||||
|
#ifdef __BIG_ENDIAN__
|
||||||
|
lu=GETLE16D(SRCPtr++);
|
||||||
|
#else
|
||||||
|
lu=*SRCPtr++;
|
||||||
|
#endif
|
||||||
|
*DSTPtr++=
|
||||||
|
((lu << 10) & 0x7c007c00)|
|
||||||
|
((lu) & 0x3e003e0)|
|
||||||
|
((lu >> 10) & 0x1f001f);
|
||||||
|
}
|
||||||
|
SRCPtr += LineOffset;
|
||||||
|
DSTPtr += SurfOffset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Swap image buffer
|
||||||
|
whichImage = 1 - whichImage;
|
||||||
|
|
||||||
|
[self renderScreen];
|
||||||
|
[glLock unlock];
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)clearBuffer:(BOOL)display
|
- (void)clearBuffer:(BOOL)display
|
||||||
|
@ -212,6 +695,75 @@ extern time_t tStart;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (GLuint)loadShader:(GLenum)type location:(NSURL*)filename
|
||||||
|
{
|
||||||
|
GLuint myShader = 0;
|
||||||
|
|
||||||
|
GLsizei logsize = 0;
|
||||||
|
GLint compile_status = GL_TRUE;
|
||||||
|
char *log = NULL;
|
||||||
|
char *src = NULL;
|
||||||
|
|
||||||
|
/* creation d'un shader de sommet */
|
||||||
|
myShader = glCreateShader(type);
|
||||||
|
if(myShader == 0)
|
||||||
|
{
|
||||||
|
NSLog(@"impossible de creer le shader");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* chargement du code source */
|
||||||
|
src = [PluginGLView loadSource:filename];
|
||||||
|
if(src == NULL)
|
||||||
|
{
|
||||||
|
/* theoriquement, la fonction LoadSource a deja affiche un message
|
||||||
|
d'erreur, nous nous contenterons de supprimer notre shader
|
||||||
|
et de retourner 0 */
|
||||||
|
|
||||||
|
glDeleteShader(myShader);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* assignation du code source */
|
||||||
|
glShaderSource(myShader, 1, (const GLchar**)&src, NULL);
|
||||||
|
|
||||||
|
/* compilation du shader */
|
||||||
|
glCompileShader(myShader);
|
||||||
|
|
||||||
|
/* liberation de la memoire du code source */
|
||||||
|
free(src);
|
||||||
|
src = NULL;
|
||||||
|
|
||||||
|
/* verification du succes de la compilation */
|
||||||
|
glGetShaderiv(myShader, GL_COMPILE_STATUS, &compile_status);
|
||||||
|
if(compile_status != GL_TRUE)
|
||||||
|
{
|
||||||
|
/* erreur a la compilation recuperation du log d'erreur */
|
||||||
|
|
||||||
|
/* on recupere la taille du message d'erreur */
|
||||||
|
glGetShaderiv(myShader, GL_INFO_LOG_LENGTH, &logsize);
|
||||||
|
|
||||||
|
/* on alloue un espace memoire dans lequel OpenGL ecrira le message */
|
||||||
|
log = calloc(logsize + 1, 1);
|
||||||
|
if(log == NULL)
|
||||||
|
{
|
||||||
|
NSLog(@"impossible d'allouer de la memoire!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
glGetShaderInfoLog(myShader, logsize, &logsize, log);
|
||||||
|
NSLog(@"impossible de compiler le shader '%@' :\n%s",
|
||||||
|
[filename path], log);
|
||||||
|
|
||||||
|
/* ne pas oublier de liberer la memoire et notre shader */
|
||||||
|
free(log);
|
||||||
|
glDeleteShader(myShader);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return myShader;
|
||||||
|
}
|
||||||
|
|
||||||
+ (char*)loadSource:(NSURL *)filename
|
+ (char*)loadSource:(NSURL *)filename
|
||||||
{
|
{
|
||||||
//Since we're passing Cocoa NSURLs, let's use Cocoa's methods
|
//Since we're passing Cocoa NSURLs, let's use Cocoa's methods
|
||||||
|
|
Loading…
Reference in New Issue
Block a user