this repo has no description
at Multitexture 158 lines 5.3 kB view raw
1#include "common.h" 2#include <string.h> 3#include <stdlib.h> 4 5void printRenderers(void) 6{ 7 SDL_version compiled; 8 SDL_version linked; 9 GPU_RendererID* renderers; 10 int i; 11 int order_size; 12 GPU_RendererID order[GPU_RENDERER_ORDER_MAX]; 13 14 GPU_SetDebugLevel(GPU_DEBUG_LEVEL_MAX); 15 16 compiled = GPU_GetCompiledVersion(); 17 linked = GPU_GetLinkedVersion(); 18 if(compiled.major != linked.major || compiled.minor != linked.minor || compiled.patch != linked.patch) 19 GPU_Log("SDL_gpu v%d.%d.%d (compiled with v%d.%d.%d)\n", linked.major, linked.minor, linked.patch, compiled.major, compiled.minor, compiled.patch); 20 else 21 GPU_Log("SDL_gpu v%d.%d.%d\n", linked.major, linked.minor, linked.patch); 22 23 renderers = (GPU_RendererID*)malloc(sizeof(GPU_RendererID)*GPU_GetNumRegisteredRenderers()); 24 GPU_GetRegisteredRendererList(renderers); 25 26 GPU_Log("\nAvailable renderers:\n"); 27 for(i = 0; i < GPU_GetNumRegisteredRenderers(); i++) 28 { 29 GPU_Log("* %s (%d.%d)\n", renderers[i].name, renderers[i].major_version, renderers[i].minor_version); 30 } 31 GPU_Log("Renderer init order:\n"); 32 33 GPU_GetRendererOrder(&order_size, order); 34 for(i = 0; i < order_size; i++) 35 { 36 GPU_Log("%d) %s (%d.%d)\n", i+1, order[i].name, order[i].major_version, order[i].minor_version); 37 } 38 GPU_Log("\n"); 39 40 free(renderers); 41} 42 43void printCurrentRenderer(void) 44{ 45 GPU_Renderer* renderer = GPU_GetCurrentRenderer(); 46 GPU_RendererID id = renderer->id; 47 48 GPU_Log("Using renderer: %s (%d.%d)\n", id.name, id.major_version, id.minor_version); 49 GPU_Log(" Shader versions supported: %d to %d\n\n", renderer->min_shader_version, renderer->max_shader_version); 50} 51 52GPU_Target* initialize_demo(int argc, char** argv, Uint16 w, Uint16 h) 53{ 54 GPU_Target* screen; 55 printRenderers(); 56 57 GPU_RendererEnum renderer = GPU_RENDERER_UNKNOWN; 58 59 // Parse command line args 60 { 61 for(int i = 1; i < argc; i++) 62 { 63 char* s = argv[i]; 64 65 if(s[0] == '-') 66 { 67 if(strcmp(s, "-r") == 0 || strcmp(s, "--renderer") == 0) 68 { 69 i++; 70 if(i >= argc) 71 break; 72 73 s = argv[i]; 74 if(SDL_strcasecmp(s, "BASE") == 0 || SDL_strcasecmp(s, "OpenGL_BASE") == 0 || SDL_strcasecmp(s, "OpenGL_1_BASE") == 0) 75 renderer = GPU_RENDERER_OPENGL_1_BASE; 76 else if(SDL_strcasecmp(s, "OpenGL_1") == 0) 77 renderer = GPU_RENDERER_OPENGL_1; 78 else if(SDL_strcasecmp(s, "OpenGL_2") == 0) 79 renderer = GPU_RENDERER_OPENGL_2; 80 else if(SDL_strcasecmp(s, "OpenGL_3") == 0) 81 renderer = GPU_RENDERER_OPENGL_3; 82 else if(SDL_strcasecmp(s, "OpenGL_4") == 0) 83 renderer = GPU_RENDERER_OPENGL_4; 84 } 85 } 86 } 87 } 88 89 if(renderer == GPU_RENDERER_UNKNOWN) 90 screen = GPU_Init(w, h, GPU_DEFAULT_INIT_FLAGS); 91 else 92 screen = GPU_InitRenderer(renderer, w, h, GPU_DEFAULT_INIT_FLAGS); 93 94 if(screen == NULL) 95 return NULL; 96 97 printCurrentRenderer(); 98 return screen; 99} 100 101 102// Loads a shader and prepends version/compatibility info before compiling it. 103// Normally, you can just use GPU_LoadShader() for shader source files or GPU_CompileShader() for strings. 104// However, some hardware (certain ATI/AMD cards) does not let you put non-#version preprocessing at the top of the file. 105// Therefore, I need to prepend the version info here so I can support both GLSL and GLSLES with one shader file. 106Uint32 load_shader(GPU_ShaderEnum shader_type, const char* filename) 107{ 108 SDL_RWops* rwops; 109 Uint32 shader; 110 char* source; 111 int header_size, file_size; 112 const char* header = ""; 113 GPU_Renderer* renderer = GPU_GetCurrentRenderer(); 114 115 // Open file 116 rwops = SDL_RWFromFile(filename, "rb"); 117 if(rwops == NULL) 118 { 119 GPU_PushErrorCode("load_shader", GPU_ERROR_FILE_NOT_FOUND, "Shader file \"%s\" not found", filename); 120 return 0; 121 } 122 123 // Get file size 124 file_size = SDL_RWseek(rwops, 0, SEEK_END); 125 SDL_RWseek(rwops, 0, SEEK_SET); 126 127 // Get size from header 128 if(renderer->shader_language == GPU_LANGUAGE_GLSL) 129 { 130 if(renderer->max_shader_version >= 120) 131 header = "#version 120\n"; 132 else 133 header = "#version 110\n"; // Maybe this is good enough? 134 } 135 else if(renderer->shader_language == GPU_LANGUAGE_GLSLES) 136 header = "#version 100\nprecision mediump int;\nprecision mediump float;\n"; 137 138 header_size = strlen(header); 139 140 // Allocate source buffer 141 source = (char*)malloc(sizeof(char)*(header_size + file_size + 1)); 142 143 // Prepend header 144 strcpy(source, header); 145 146 // Read in source code 147 SDL_RWread(rwops, source + strlen(source), 1, file_size); 148 source[header_size + file_size] = '\0'; 149 150 // Compile the shader 151 shader = GPU_CompileShader(shader_type, source); 152 153 // Clean up 154 free(source); 155 SDL_RWclose(rwops); 156 157 return shader; 158}