ShaderProgramGL.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #include "ShaderProgramGL.h"
  2. #include "VertexDeclarationGL.h"
  3. #include "oxgl.h"
  4. #ifndef __S3E__
  5. #include "SDL.h"
  6. #endif
  7. namespace oxygine
  8. {
  9. ShaderProgramGL::ShaderProgramGL(GLuint p) : _program(p)
  10. {
  11. }
  12. ShaderProgramGL::~ShaderProgramGL()
  13. {
  14. if (_program)
  15. oxglDeleteProgram(_program);
  16. CHECKGL();
  17. }
  18. unsigned int ShaderProgramGL::getID() const
  19. {
  20. return _program;
  21. }
  22. int ShaderProgramGL::getUniformLocation(const char* id) const
  23. {
  24. int i = oxglGetUniformLocation(_program, id);
  25. //if (i == -1)
  26. CHECKGL();
  27. return i;
  28. }
  29. void printShaderInfoLog(GLuint shader)
  30. {
  31. GLint length = 0;
  32. oxglGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
  33. if (length)
  34. {
  35. GLint success;
  36. oxglGetShaderiv(shader, GL_COMPILE_STATUS, &success);
  37. if (success != GL_TRUE)
  38. {
  39. std::vector<char> bf;
  40. bf.resize(length);
  41. oxglGetShaderInfoLog(shader, (int)bf.size(), NULL, &bf.front());
  42. log::messageln("shader build error: %s", &bf.front());
  43. OX_ASSERT(!"shader build error");
  44. exit(1);
  45. }
  46. }
  47. CHECKGL();
  48. }
  49. unsigned int ShaderProgramGL::createShader(unsigned int type, const char* data, const char* prepend, const char* append)
  50. {
  51. GLuint shader = oxglCreateShader(type);
  52. const char* sources[16];
  53. const char** ptr = &sources[0];
  54. bool gles = false;
  55. #ifdef __S3E__
  56. gles = true;
  57. #elif OXYGINE_SDL
  58. int profile = 0;
  59. SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &profile);
  60. gles = profile == SDL_GL_CONTEXT_PROFILE_ES;
  61. #else
  62. #endif
  63. #ifndef EMSCRIPTEN
  64. if (!gles)
  65. {
  66. log::messageln("not gles version");
  67. static const char nonGLES[] =
  68. "#define lowp\n"
  69. "#define mediump\n"
  70. "#define highp\n";
  71. *ptr = nonGLES;
  72. ptr++;
  73. }
  74. #endif
  75. if (prepend)
  76. {
  77. *ptr = prepend;
  78. ptr++;
  79. }
  80. *ptr = data;
  81. ptr++;
  82. if (append)
  83. {
  84. *ptr = append;
  85. ptr++;
  86. }
  87. int num = (int)(ptr - sources);
  88. oxglShaderSource(shader, num, sources, 0);
  89. oxglCompileShader(shader);
  90. printShaderInfoLog(shader);
  91. CHECKGL();
  92. return shader;
  93. }
  94. unsigned int ShaderProgramGL::createProgram(int vs, int fs, const VertexDeclarationGL* decl)
  95. {
  96. int p = oxglCreateProgram();
  97. oxglAttachShader(p, vs);
  98. oxglAttachShader(p, fs);
  99. for (int i = 0; i < decl->numElements; ++i)
  100. oxglBindAttribLocation(p, decl->elements[i].index, decl->elements[i].name);
  101. oxglLinkProgram(p);
  102. CHECKGL();
  103. return p;
  104. }
  105. }