ShaderProgramGL.cpp 3.0 KB

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