istereo2
diff src/sdr.c @ 24:9d53a4938ce8
port to android mostly complete, ads not done, and needs some polishing
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sun, 04 Oct 2015 08:15:24 +0300 |
parents | 81d35769f546 |
children |
line diff
1.1 --- a/src/sdr.c Sat Oct 03 06:10:30 2015 +0300 1.2 +++ b/src/sdr.c Sun Oct 04 08:15:24 2015 +0300 1.3 @@ -1,27 +1,11 @@ 1.4 -/* 1.5 -Stereoscopic tunnel for iOS. 1.6 -Copyright (C) 2011 John Tsiombikas <nuclear@member.fsf.org> 1.7 - 1.8 -This program is free software: you can redistribute it and/or modify 1.9 -it under the terms of the GNU General Public License as published by 1.10 -the Free Software Foundation, either version 3 of the License, or 1.11 -(at your option) any later version. 1.12 - 1.13 -This program is distributed in the hope that it will be useful, 1.14 -but WITHOUT ANY WARRANTY; without even the implied warranty of 1.15 -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1.16 -GNU General Public License for more details. 1.17 - 1.18 -You should have received a copy of the GNU General Public License 1.19 -along with this program. If not, see <http://www.gnu.org/licenses/>. 1.20 -*/ 1.21 - 1.22 #include <stdio.h> 1.23 #include <stdlib.h> 1.24 #include <string.h> 1.25 #include <errno.h> 1.26 +#include <stdarg.h> 1.27 #include <assert.h> 1.28 #include "opengl.h" 1.29 +#include "assman.h" 1.30 1.31 #if defined(unix) || defined(__unix__) 1.32 #include <unistd.h> 1.33 @@ -30,6 +14,7 @@ 1.34 1.35 #include "sdr.h" 1.36 1.37 +static const char *sdrtypestr(unsigned int sdrtype); 1.38 1.39 unsigned int create_vertex_shader(const char *src) 1.40 { 1.41 @@ -41,6 +26,33 @@ 1.42 return create_shader(src, GL_FRAGMENT_SHADER); 1.43 } 1.44 1.45 +unsigned int create_tessctl_shader(const char *src) 1.46 +{ 1.47 +#ifdef GL_TESS_CONTROL_SHADER 1.48 + return create_shader(src, GL_TESS_CONTROL_SHADER); 1.49 +#else 1.50 + return 0; 1.51 +#endif 1.52 +} 1.53 + 1.54 +unsigned int create_tesseval_shader(const char *src) 1.55 +{ 1.56 +#ifdef GL_TESS_EVALUATION_SHADER 1.57 + return create_shader(src, GL_TESS_EVALUATION_SHADER); 1.58 +#else 1.59 + return 0; 1.60 +#endif 1.61 +} 1.62 + 1.63 +unsigned int create_geometry_shader(const char *src) 1.64 +{ 1.65 +#ifdef GL_GEOMETRY_SHADER 1.66 + return create_shader(src, GL_GEOMETRY_SHADER); 1.67 +#else 1.68 + return 0; 1.69 +#endif 1.70 +} 1.71 + 1.72 unsigned int create_shader(const char *src, unsigned int sdr_type) 1.73 { 1.74 unsigned int sdr; 1.75 @@ -65,6 +77,7 @@ 1.76 if((info_str = malloc(info_len + 1))) { 1.77 glGetShaderInfoLog(sdr, info_len, 0, info_str); 1.78 assert(glGetError() == GL_NO_ERROR); 1.79 + info_str[info_len] = 0; 1.80 } 1.81 } 1.82 1.83 @@ -95,39 +108,58 @@ 1.84 return load_shader(fname, GL_FRAGMENT_SHADER); 1.85 } 1.86 1.87 +unsigned int load_tessctl_shader(const char *fname) 1.88 +{ 1.89 +#ifdef GL_TESS_CONTROL_SHADER 1.90 + return load_shader(fname, GL_TESS_CONTROL_SHADER); 1.91 +#else 1.92 + return 0; 1.93 +#endif 1.94 +} 1.95 + 1.96 +unsigned int load_tesseval_shader(const char *fname) 1.97 +{ 1.98 +#ifdef GL_TESS_EVALUATION_SHADER 1.99 + return load_shader(fname, GL_TESS_EVALUATION_SHADER); 1.100 +#else 1.101 + return 0; 1.102 +#endif 1.103 +} 1.104 + 1.105 +unsigned int load_geometry_shader(const char *fname) 1.106 +{ 1.107 +#ifdef GL_GEOMETRY_SHADER 1.108 + return load_shader(fname, GL_GEOMETRY_SHADER); 1.109 +#else 1.110 + return 0; 1.111 +#endif 1.112 +} 1.113 + 1.114 unsigned int load_shader(const char *fname, unsigned int sdr_type) 1.115 { 1.116 -#if defined(unix) || defined(__unix__) 1.117 - struct stat st; 1.118 -#endif 1.119 unsigned int sdr; 1.120 size_t filesize; 1.121 - FILE *fp; 1.122 + ass_file *fp; 1.123 char *src; 1.124 1.125 - if(!(fp = fopen(fname, "r"))) { 1.126 + if(!(fp = ass_fopen(fname, "rb"))) { 1.127 fprintf(stderr, "failed to open shader %s: %s\n", fname, strerror(errno)); 1.128 return 0; 1.129 } 1.130 1.131 -#if defined(unix) || defined(__unix__) 1.132 - fstat(fileno(fp), &st); 1.133 - filesize = st.st_size; 1.134 -#else 1.135 - fseek(fp, 0, SEEK_END); 1.136 - filesize = ftell(fp); 1.137 - fseek(fp, 0, SEEK_SET); 1.138 -#endif /* unix */ 1.139 + filesize = ass_fseek(fp, 0, SEEK_END); 1.140 + /*filesize = ass_ftell(fp);*/ 1.141 + ass_fseek(fp, 0, SEEK_SET); 1.142 1.143 if(!(src = malloc(filesize + 1))) { 1.144 - fclose(fp); 1.145 + ass_fclose(fp); 1.146 return 0; 1.147 } 1.148 - fread(src, 1, filesize, fp); 1.149 + ass_fread(src, 1, filesize, fp); 1.150 src[filesize] = 0; 1.151 - fclose(fp); 1.152 + ass_fclose(fp); 1.153 1.154 - fprintf(stderr, "compiling %s shader: %s... ", (sdr_type == GL_VERTEX_SHADER ? "vertex" : "pixel"), fname); 1.155 + fprintf(stderr, "compiling %s shader: %s... ", sdrtypestr(sdr_type), fname); 1.156 sdr = create_shader(src, sdr_type); 1.157 1.158 free(src); 1.159 @@ -135,27 +167,6 @@ 1.160 } 1.161 1.162 1.163 -unsigned int get_vertex_shader(const char *fname) 1.164 -{ 1.165 - return get_shader(fname, GL_VERTEX_SHADER); 1.166 -} 1.167 - 1.168 -unsigned int get_pixel_shader(const char *fname) 1.169 -{ 1.170 - return get_shader(fname, GL_FRAGMENT_SHADER); 1.171 -} 1.172 - 1.173 -unsigned int get_shader(const char *fname, unsigned int sdr_type) 1.174 -{ 1.175 - unsigned int sdr; 1.176 - 1.177 - if(!fname || !(sdr = load_shader(fname, sdr_type))) { 1.178 - return 0; 1.179 - } 1.180 - return sdr; 1.181 -} 1.182 - 1.183 - 1.184 /* ---- gpu programs ---- */ 1.185 1.186 unsigned int create_program(void) 1.187 @@ -165,18 +176,28 @@ 1.188 return prog; 1.189 } 1.190 1.191 -unsigned int create_program_link(unsigned int vs, unsigned int ps) 1.192 +unsigned int create_program_link(unsigned int sdr0, ...) 1.193 { 1.194 - unsigned int prog; 1.195 + unsigned int prog, sdr; 1.196 + va_list ap; 1.197 1.198 if(!(prog = create_program())) { 1.199 return 0; 1.200 } 1.201 1.202 - attach_shader(prog, vs); 1.203 - assert(glGetError() == GL_NO_ERROR); 1.204 - attach_shader(prog, ps); 1.205 - assert(glGetError() == GL_NO_ERROR); 1.206 + attach_shader(prog, sdr0); 1.207 + if(glGetError()) { 1.208 + return 0; 1.209 + } 1.210 + 1.211 + va_start(ap, sdr0); 1.212 + while((sdr = va_arg(ap, unsigned int))) { 1.213 + attach_shader(prog, sdr); 1.214 + if(glGetError()) { 1.215 + return 0; 1.216 + } 1.217 + } 1.218 + va_end(ap); 1.219 1.220 if(link_program(prog) == -1) { 1.221 free_program(prog); 1.222 @@ -187,12 +208,15 @@ 1.223 1.224 unsigned int create_program_load(const char *vfile, const char *pfile) 1.225 { 1.226 - unsigned int vs, ps; 1.227 + unsigned int vs = 0, ps = 0; 1.228 1.229 - if(!(vs = get_vertex_shader(vfile)) || !(ps = get_pixel_shader(pfile))) { 1.230 + if(vfile && *vfile && !(vs = load_vertex_shader(vfile))) { 1.231 return 0; 1.232 } 1.233 - return create_program_link(vs, ps); 1.234 + if(pfile && *pfile && !(ps = load_pixel_shader(pfile))) { 1.235 + return 0; 1.236 + } 1.237 + return create_program_link(vs, ps, 0); 1.238 } 1.239 1.240 void free_program(unsigned int sdr) 1.241 @@ -202,8 +226,16 @@ 1.242 1.243 void attach_shader(unsigned int prog, unsigned int sdr) 1.244 { 1.245 - glAttachShader(prog, sdr); 1.246 - assert(glGetError() == GL_NO_ERROR); 1.247 + int err; 1.248 + 1.249 + if(prog && sdr) { 1.250 + assert(glGetError() == GL_NO_ERROR); 1.251 + glAttachShader(prog, sdr); 1.252 + if((err = glGetError()) != GL_NO_ERROR) { 1.253 + fprintf(stderr, "failed to attach shader %u to program %u (err: 0x%x)\n", sdr, prog, err); 1.254 + abort(); 1.255 + } 1.256 + } 1.257 } 1.258 1.259 int link_program(unsigned int prog) 1.260 @@ -222,6 +254,7 @@ 1.261 if((info_str = malloc(info_len + 1))) { 1.262 glGetProgramInfoLog(prog, info_len, 0, info_str); 1.263 assert(glGetError() == GL_NO_ERROR); 1.264 + info_str[info_len] = 0; 1.265 } 1.266 } 1.267 1.268 @@ -259,13 +292,13 @@ 1.269 #define BEGIN_UNIFORM_CODE \ 1.270 int loc, curr_prog; \ 1.271 glGetIntegerv(GL_CURRENT_PROGRAM, &curr_prog); \ 1.272 - if(curr_prog != prog && bind_program(prog) == -1) { \ 1.273 + if((unsigned int)curr_prog != prog && bind_program(prog) == -1) { \ 1.274 return -1; \ 1.275 } \ 1.276 if((loc = glGetUniformLocation(prog, name)) != -1) 1.277 1.278 #define END_UNIFORM_CODE \ 1.279 - if(curr_prog != prog) { \ 1.280 + if((unsigned int)curr_prog != prog) { \ 1.281 bind_program(curr_prog); \ 1.282 } \ 1.283 return loc == -1 ? -1 : 0 1.284 @@ -286,6 +319,14 @@ 1.285 END_UNIFORM_CODE; 1.286 } 1.287 1.288 +int set_uniform_float2(unsigned int prog, const char *name, float x, float y) 1.289 +{ 1.290 + BEGIN_UNIFORM_CODE { 1.291 + glUniform2f(loc, x, y); 1.292 + } 1.293 + END_UNIFORM_CODE; 1.294 +} 1.295 + 1.296 int set_uniform_float3(unsigned int prog, const char *name, float x, float y, float z) 1.297 { 1.298 BEGIN_UNIFORM_CODE { 1.299 @@ -323,13 +364,13 @@ 1.300 int loc, curr_prog; 1.301 1.302 glGetIntegerv(GL_CURRENT_PROGRAM, &curr_prog); 1.303 - if(curr_prog != prog && bind_program(prog) == -1) { 1.304 + if((unsigned int)curr_prog != prog && bind_program(prog) == -1) { 1.305 return -1; 1.306 } 1.307 1.308 loc = glGetAttribLocation(prog, (char*)name); 1.309 1.310 - if(curr_prog != prog) { 1.311 + if((unsigned int)curr_prog != prog) { 1.312 bind_program(curr_prog); 1.313 } 1.314 return loc; 1.315 @@ -339,3 +380,29 @@ 1.316 { 1.317 glVertexAttrib3f(attr_loc, x, y, z); 1.318 } 1.319 + 1.320 +static const char *sdrtypestr(unsigned int sdrtype) 1.321 +{ 1.322 + switch(sdrtype) { 1.323 + case GL_VERTEX_SHADER: 1.324 + return "vertex"; 1.325 + case GL_FRAGMENT_SHADER: 1.326 + return "pixel"; 1.327 +#ifdef GL_TESS_CONTROL_SHADER 1.328 + case GL_TESS_CONTROL_SHADER: 1.329 + return "tessellation control"; 1.330 +#endif 1.331 +#ifdef GL_TESS_EVALUATION_SHADER 1.332 + case GL_TESS_EVALUATION_SHADER: 1.333 + return "tessellation evaluation"; 1.334 +#endif 1.335 +#ifdef GL_GEOMETRY_SHADER 1.336 + case GL_GEOMETRY_SHADER: 1.337 + return "geometry"; 1.338 +#endif 1.339 + 1.340 + default: 1.341 + break; 1.342 + } 1.343 + return "<unknown>"; 1.344 +}