diff options
| author | SND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2012-09-17 01:15:40 +0000 |
|---|---|---|
| committer | SND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2012-09-17 01:15:40 +0000 |
| commit | a4905ffaa0185235cc638098dae277f8abc0a56c (patch) | |
| tree | 03f508b54719c7af768a211e3655aada65577671 /macosx/plugins/DFXVideo/macsrc | |
| parent | 8ddbbfe157a5ed6d52bb07dcbef2e9c5814e80e0 (diff) | |
| download | pcsxr-a4905ffaa0185235cc638098dae277f8abc0a56c.tar.gz | |
Updating projects to build on Xcode 4.4
Added OpenGL shader support to the Mac software renderer.
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@79892 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'macosx/plugins/DFXVideo/macsrc')
| -rw-r--r-- | macosx/plugins/DFXVideo/macsrc/PluginConfigController.h | 13 | ||||
| -rw-r--r-- | macosx/plugins/DFXVideo/macsrc/PluginConfigController.m | 95 | ||||
| -rw-r--r-- | macosx/plugins/DFXVideo/macsrc/PluginGLView.h | 8 | ||||
| -rw-r--r-- | macosx/plugins/DFXVideo/macsrc/PluginGLView.m | 253 | ||||
| -rw-r--r-- | macosx/plugins/DFXVideo/macsrc/SGPUPreferences.h | 18 |
5 files changed, 363 insertions, 24 deletions
diff --git a/macosx/plugins/DFXVideo/macsrc/PluginConfigController.h b/macosx/plugins/DFXVideo/macsrc/PluginConfigController.h index 0e734411..ec9c0203 100644 --- a/macosx/plugins/DFXVideo/macsrc/PluginConfigController.h +++ b/macosx/plugins/DFXVideo/macsrc/PluginConfigController.h @@ -4,7 +4,7 @@ #import <Cocoa/Cocoa.h> -@interface PluginConfigController : NSWindowController +@interface NetSfPeopsSoftGPUPluginConfigController : NSWindowController { IBOutlet NSControl *autoFullScreen; IBOutlet NSPopUpButton *ditherMode; @@ -13,6 +13,15 @@ IBOutlet NSControl *hackEnable; IBOutlet NSView *hacksView; IBOutlet NSControl *vSync; + IBOutlet NSControl *shaders; + IBOutlet NSTextField *vertexShaderViewablePath; + IBOutlet NSTextField *fragmentShaderViewablePath; + IBOutlet NSControl *vertexChooser; + IBOutlet NSControl *fragmentChooser; + IBOutlet NSView *shadersView; + + NSURL *vertexPath; + NSURL *fragmentPath; NSMutableDictionary *keyValues; } @@ -20,6 +29,8 @@ - (IBAction)ok:(id)sender; - (IBAction)reset:(id)sender; - (IBAction)hackToggle:(id)sender; +- (IBAction)toggleShader:(id)sender; +- (IBAction)selectShader:(id)sender; - (void)loadValues; diff --git a/macosx/plugins/DFXVideo/macsrc/PluginConfigController.m b/macosx/plugins/DFXVideo/macsrc/PluginConfigController.m index c765ce5d..b22167ca 100644 --- a/macosx/plugins/DFXVideo/macsrc/PluginConfigController.m +++ b/macosx/plugins/DFXVideo/macsrc/PluginConfigController.m @@ -3,6 +3,7 @@ #include "cfg.h" #include "menu.h" #include "externals.h" +#include "SGPUPreferences.h" #ifdef ENABLE_NLS #include <libintl.h> @@ -89,9 +90,32 @@ void SoftDlgProc() [window makeKeyAndOrderFront:nil]; } +BOOL isShaderEnabled() +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSDictionary *keyValues = [defaults dictionaryForKey:PrefsKey]; + return [[keyValues objectForKey:@"UseShader"] boolValue]; +} + +NSURL *PSXVertexShader() +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSDictionary *keyValues = [defaults dictionaryForKey:PrefsKey]; + return [keyValues objectForKey:@"VertexShader"]; +} + +NSURL *PSXFragmentShader() +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSDictionary *keyValues = [defaults dictionaryForKey:PrefsKey]; + return [keyValues objectForKey:@"FragmentShader"]; +} + + void ReadConfig(void) { NSDictionary *keyValues; + NSBundle *selfBundle = [NSBundle bundleWithIdentifier:APP_ID]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys: [NSMutableDictionary dictionaryWithObjectsAndKeys: @@ -103,6 +127,9 @@ void ReadConfig(void) [NSNumber numberWithBool:NO], @"Enable Hacks", [NSNumber numberWithInt:1], @"Dither Mode", [NSNumber numberWithLong:0], @"Hacks", + [[selfBundle URLForResource:@"gpuPeteOGL2" withExtension:@"slv"] fileReferenceURL], @"VertexShader", + [[selfBundle URLForResource:@"gpuPeteOGL2" withExtension:@"slf"] fileReferenceURL], @"FragmentShader", + [NSNumber numberWithBool:NO], @"UseShader", nil], PrefsKey, nil]]; @@ -143,7 +170,7 @@ void ReadConfig(void) BuildDispMenu(0); } -@implementation PluginConfigController +@implementation NetSfPeopsSoftGPUPluginConfigController - (IBAction)cancel:(id)sender { @@ -161,20 +188,22 @@ void ReadConfig(void) //[writeDic setObject:[NSNumber numberWithInt:[frameLimit intValue]] forKey:@"Frame Limit"]; [writeDic setObject:[NSNumber numberWithInt:[vSync intValue]] forKey:@"VSync"]; [writeDic setObject:[NSNumber numberWithInt:[hackEnable intValue]] forKey:@"Enable Hacks"]; + [writeDic setObject:[NSNumber numberWithInt:[shaders intValue]] forKey:@"UseShader"]; [writeDic setObject:[NSNumber numberWithInt:[ditherMode indexOfSelectedItem]] forKey:@"Dither Mode"]; unsigned long hackValues = 0; - int i; NSArray *views = [hacksView subviews]; - for (i=0; i<[views count]; i++) { - NSView *control = [views objectAtIndex:i]; + for (NSView *control in views) { if ([control isKindOfClass:[NSButton class]]) { hackValues |= [(NSControl *)control intValue] << ([control tag] - 1); } } - [writeDic setObject:[NSNumber numberWithLong:hackValues] forKey:@"Hacks"]; + [writeDic setObject:[NSNumber numberWithUnsignedLong:hackValues] forKey:@"Hacks"]; + + [writeDic setObject:[vertexPath fileReferenceURL] forKey:@"VertexShader"]; + [writeDic setObject:[fragmentPath fileReferenceURL] forKey:@"FragmentShader"]; // write to defaults [defaults setObject:writeDic forKey:PrefsKey]; @@ -196,17 +225,49 @@ void ReadConfig(void) - (IBAction)hackToggle:(id)sender { BOOL enable = [sender intValue] ? YES : NO; - int i; NSArray *views = [hacksView subviews]; - for (i=0; i<[views count]; i++) { - NSView *control = [views objectAtIndex:i]; + for (NSView *control in views) { if ([control isKindOfClass:[NSButton class]]) { [(NSControl *)control setEnabled:enable]; } } } +- (IBAction)toggleShader:(id)sender { + BOOL enable = [sender intValue] ? YES : NO; + NSArray *views = [shadersView subviews]; + + for (NSView *control in views) { + [(NSControl *)control setEnabled:enable]; + } +} + +- (IBAction)selectShader:(id)sender { + NSOpenPanel *openPanel = [[NSOpenPanel openPanel] retain]; + [openPanel setAllowsMultipleSelection:NO]; + [openPanel setCanChooseDirectories:NO]; + [openPanel setCanChooseFiles:YES]; + if ([openPanel runModal] == NSFileHandlingPanelOKButton) + { + if ([sender tag] == 1) { + [vertexPath release]; + vertexPath = [[openPanel URL] copy]; + [vertexShaderViewablePath setTitleWithMnemonic:[vertexPath path]]; + + } else { + [fragmentPath release]; + fragmentPath = [[openPanel URL] copy]; + [fragmentShaderViewablePath setTitleWithMnemonic:[fragmentPath path]]; + + } + } + + + + [openPanel release]; +} + - (void)loadValues { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; @@ -225,12 +286,14 @@ void ReadConfig(void) [ditherMode selectItemAtIndex:[[keyValues objectForKey:@"Dither Mode"] intValue]]; + vertexPath = [[keyValues objectForKey:@"VertexShader"] copy]; + fragmentPath = [[keyValues objectForKey:@"FragmentShader"] copy]; + [vertexShaderViewablePath setTitleWithMnemonic:[vertexPath path]]; + [fragmentShaderViewablePath setTitleWithMnemonic:[fragmentPath path]]; unsigned long hackValues = [[keyValues objectForKey:@"Hacks"] longValue]; - int i; NSArray *views = [hacksView subviews]; - for (i=0; i<[views count]; i++) { - NSView *control = [views objectAtIndex:i]; + for (NSView *control in views) { if ([control isKindOfClass:[NSButton class]]) { [(NSControl *)control setIntValue:(hackValues >> ([control tag] - 1)) & 1]; } @@ -241,7 +304,17 @@ void ReadConfig(void) - (void)awakeFromNib { + //I don't know why we need to do this... hacksView = [[hacksView subviews] objectAtIndex:0]; + shadersView = [[shadersView subviews] objectAtIndex:0]; +} + +- (void)dealloc +{ + [vertexPath release]; + [fragmentPath release]; + + [super dealloc]; } @end diff --git a/macosx/plugins/DFXVideo/macsrc/PluginGLView.h b/macosx/plugins/DFXVideo/macsrc/PluginGLView.h index fea3b89a..fe2e5f78 100644 --- a/macosx/plugins/DFXVideo/macsrc/PluginGLView.h +++ b/macosx/plugins/DFXVideo/macsrc/PluginGLView.h @@ -29,7 +29,12 @@ GLubyte *image_base; GLubyte *image[IMAGE_COUNT]; + GLboolean useShader; + float shaderQuality; GLint buffers; + GLuint vertexShader; + GLuint fragmentShader; + GLuint program; //GLint frame_rate; GLenum texture_hint; @@ -59,5 +64,8 @@ - (void)swapBuffer; - (void)clearBuffer:(BOOL)display; - (void)loadTextures: (GLboolean)first; +- (GLuint)loadShader:(GLenum)type location:(NSURL*)filename; +- (char*)loadSource:(NSURL *)filename; +void printProgramInfoLog(GLuint obj); @end diff --git a/macosx/plugins/DFXVideo/macsrc/PluginGLView.m b/macosx/plugins/DFXVideo/macsrc/PluginGLView.m index 6046fe79..2c79436b 100644 --- a/macosx/plugins/DFXVideo/macsrc/PluginGLView.m +++ b/macosx/plugins/DFXVideo/macsrc/PluginGLView.m @@ -20,8 +20,8 @@ #import <OpenGL/glext.h> #import <OpenGL/glu.h> #import <GLUT/glut.h> -#import <Carbon/Carbon.h> #import "PluginGLView.h" +#import "SGPUPreferences.h" #include "externals.h" #undef BOOL #include "gpu.h" @@ -141,7 +141,8 @@ void BlitScreen16NS(unsigned char * surf,long x,long y) 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; + //rect_texture = gluCheckExtension((const unsigned char *)"GL_EXT_texture_rectangle", strExt) ? GL_TRUE : GL_FALSE; + rect_texture = GL_FALSE; // Setup some basic OpenGL stuff glPixelStorei(GL_UNPACK_ALIGNMENT, 1); @@ -149,7 +150,27 @@ void BlitScreen16NS(unsigned char * surf,long x,long y) 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()){ + // --- Params --- + shaderQuality = 4.0; + //vertexShader = LoadShader(GL_VERTEX_SHADER,"/Users/you/shader/gpuPeteOGL2.slv"); + vertexShader = [self loadShader:GL_VERTEX_SHADER location:PSXVertexShader()]; + //fragmentShader = LoadShader(GL_FRAGMENT_SHADER,"/Users/you/shader/gpuPeteOGL2.slf"); + 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]; @@ -292,19 +313,36 @@ void BlitScreen16NS(unsigned char * surf,long x,long y) - (void)renderScreen { int bufferIndex = whichImage; - + if (1/*[glLock tryLock]*/) { // Make this context current [[self openGLContext] makeCurrentContext]; + + // Loads the shaders + //shader=LoadShader(GL_VERTEX_SHADER,"/Users/alexandremathieu/vertex.c"); + //program=glCreateProgram(); + //glAttachShader(program, shader); + //glLinkProgram(program); + //if(program == 0){ + // printf("Program invalide bourdel\n"); + //} + if (PSXDisplay.Disabled) { glClear(GL_COLOR_BUFFER_BIT); } else { // Bind, update and draw new image - if(rect_texture) + 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); @@ -321,9 +359,45 @@ void BlitScreen16NS(unsigned char * surf,long x,long y) } 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); @@ -351,8 +425,9 @@ void BlitScreen16NS(unsigned char * surf,long x,long y) else { szDebugText[0]=0; - - strncat(szDispBuf, szMenuBuf, 63 - strlen(szDispBuf)); + if (szMenuBuf) { + strncat(szDispBuf, szMenuBuf, 63 - strlen(szDispBuf)); + } } NSRect rect = [[[self openGLContext] view] bounds]; @@ -381,6 +456,8 @@ void BlitScreen16NS(unsigned char * surf,long x,long y) glPopMatrix(); } + //printProgramInfoLog(program); + //printf("\n\n\n"); [[self openGLContext] flushBuffer]; [NSOpenGLContext clearCurrentContext]; //[glLock unlock]; @@ -390,7 +467,7 @@ void BlitScreen16NS(unsigned char * surf,long x,long y) - (void)loadTextures:(GLboolean)first { GLint i; - + printf("Loading texture\n"); //[glLock lock]; [[self openGLContext] makeCurrentContext]; @@ -464,9 +541,11 @@ void BlitScreen16NS(unsigned char * surf,long x,long y) } 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); @@ -504,7 +583,7 @@ void BlitScreen16NS(unsigned char * surf,long x,long y) //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); @@ -581,7 +660,7 @@ void BlitScreen16NS(unsigned char * surf,long x,long y) GLuint lu2 = *((GLuint *)pD+1); GLuint lu3 = *((GLuint *)pD+2); GLuint *dst = ((GLuint *)((surf)+(column*lPitch)+(row<<2))); -#ifdef __BIG_ENDIAN__ +#ifdef __POWERPC__ *(dst)= (((lu1>>24)&0xff)<<16)|(((lu1>>16)&0xff)<<8)|(((lu1>>8)&0xff)); *(dst+1)= @@ -688,4 +767,154 @@ void BlitScreen16NS(unsigned char * surf,long x,long y) lastTime = time; }*/ +- (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) + { + fprintf(stderr, "impossible de creer le shader\n"); + return 0; + } + + /* chargement du code source */ + src = [self 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 = malloc(logsize + 1); + if(log == NULL) + { + fprintf(stderr, "impossible d'allouer de la memoire !\n"); + return 0; + } + /* initialisation du contenu */ + memset(log, '\0', logsize + 1); + + glGetShaderInfoLog(myShader, logsize, &logsize, log); + fprintf(stderr, "impossible de compiler le shader '%s' :\n%s", + [[filename path] UTF8String], log); + + /* ne pas oublier de liberer la memoire et notre shader */ + free(log); + glDeleteShader(myShader); + + return 0; + } + + return myShader; +} + +- (char*)loadSource:(NSURL *)filename +{ + /*char *src = NULL; + FILE *fp = NULL; + long size; + long i; + + + // Open the file + fp = fopen(filename, "r"); + // Check if its OK + if(fp == NULL) + { + fprintf(stderr, "Impossible to open the file '%s'\n", filename); + return NULL; + } + + // Get the file size + fseek(fp, 0, SEEK_END); + size = ftell(fp); + + // Go back to the beginning + rewind(fp); + + // Allocate memory + src = malloc(size+1); // +1 for '\0' + if(src == NULL) + { + fclose(fp); + fprintf(stderr, "Memory allocation error!\n"); + return NULL; + } + + // The the file + for(i=0; i<size; i++) + src[i] = fgetc(fp); + + // Put the last char as '\0' + src[size] = '\0'; + + fclose(fp); + + return src;*/ + //NSURL *actualFile = [filename filePathURL]; + //Since we're passing Cocoa NSURLs, let's use Cocoa's methods + NSNumber *filesizeAsNS = nil; + long long filesize = 0; + [filename getResourceValue:&filesizeAsNS forKey:NSURLFileSizeKey error:nil]; + if (filesizeAsNS == nil) { + return NULL; + } + filesize = [filesizeAsNS longLongValue]; + if (filesize == 0) { + return NULL; + } + NSMutableData *shaderData = [NSMutableData dataWithContentsOfURL:filename]; + [shaderData appendBytes:"\0" length:1]; + char *shaderText = malloc(filesize + 1); + memcpy(shaderText, [shaderData bytes], filesize + 1); + return shaderText; +} + +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); + printf("%s\n",infoLog); + free(infoLog); + } +} + @end diff --git a/macosx/plugins/DFXVideo/macsrc/SGPUPreferences.h b/macosx/plugins/DFXVideo/macsrc/SGPUPreferences.h new file mode 100644 index 00000000..a4cb1054 --- /dev/null +++ b/macosx/plugins/DFXVideo/macsrc/SGPUPreferences.h @@ -0,0 +1,18 @@ +// +// SGPUPreferences.h +// PeopsSoftGPU +// +// Created by C.W. Betts on 9/16/12. +// +// + +#ifndef PeopsSoftGPU_SGPUPreferences_h +#define PeopsSoftGPU_SGPUPreferences_h + +#import <Cocoa/Cocoa.h> + +BOOL isShaderEnabled(); +NSURL *PSXFragmentShader(); +NSURL *PSXVertexShader(); + +#endif |
