| 148 | } |
| 149 | |
| 150 | static SDL_bool CompileShaderProgram(ShaderData *data) |
| 151 | { |
| 152 | const int num_tmus_bound = 4; |
| 153 | int i; |
| 154 | GLint location; |
| 155 | |
| 156 | glGetError(); |
| 157 | |
| 158 | /* Create one program object to rule them all */ |
| 159 | data->program = glCreateProgramObjectARB(); |
| 160 | |
| 161 | /* Create the vertex shader */ |
| 162 | data->vert_shader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); |
| 163 | if (!CompileShader(data->vert_shader, data->vert_source)) { |
| 164 | return SDL_FALSE; |
| 165 | } |
| 166 | |
| 167 | /* Create the fragment shader */ |
| 168 | data->frag_shader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); |
| 169 | if (!CompileShader(data->frag_shader, data->frag_source)) { |
| 170 | return SDL_FALSE; |
| 171 | } |
| 172 | |
| 173 | /* ... and in the darkness bind them */ |
| 174 | glAttachObjectARB(data->program, data->vert_shader); |
| 175 | glAttachObjectARB(data->program, data->frag_shader); |
| 176 | glLinkProgramARB(data->program); |
| 177 | |
| 178 | /* Set up some uniform variables */ |
| 179 | glUseProgramObjectARB(data->program); |
| 180 | for (i = 0; i < num_tmus_bound; ++i) { |
| 181 | char tex_name[5]; |
| 182 | SDL_snprintf(tex_name, SDL_arraysize(tex_name), "tex%d", i); |
| 183 | location = glGetUniformLocationARB(data->program, tex_name); |
| 184 | if (location >= 0) { |
| 185 | glUniform1iARB(location, i); |
| 186 | } |
| 187 | } |
| 188 | glUseProgramObjectARB(0); |
| 189 | |
| 190 | return (glGetError() == GL_NO_ERROR) ? SDL_TRUE : SDL_FALSE; |
| 191 | } |
| 192 | |
| 193 | static void DestroyShaderProgram(ShaderData *data) |
| 194 | { |
no test coverage detected