this repo has no description
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}