ComputeShader.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #include "ComputeShader.hpp"
  2. ComputeShader::ComputeShader(std::string &shader_filename)
  3. {
  4. load(shader_filename);
  5. }
  6. ComputeShader::~ComputeShader()
  7. {
  8. release();
  9. }
  10. GLuint ComputeShader::get_program() const
  11. {
  12. return m_program;
  13. }
  14. bool ComputeShader::load(std::string shader_filename)
  15. {
  16. m_shader_filename = shader_filename;
  17. std::ifstream input_file(m_shader_filename);
  18. if(!input_file){
  19. std::cout << "Can't open " << shader_filename << std::endl;
  20. return false;
  21. }
  22. std::ostringstream string_stream;
  23. string_stream << input_file.rdbuf();
  24. m_shader_source = string_stream.str();
  25. return true;
  26. }
  27. bool ComputeShader::compile()
  28. {
  29. m_shader = glCreateShader(GL_COMPUTE_SHADER);
  30. const GLchar *source_cstr = (const GLchar *)m_shader_source.c_str();
  31. glShaderSource(m_shader, 1, &source_cstr, NULL);
  32. glCompileShader(m_shader);
  33. GLint is_compiled = 0;
  34. glGetShaderiv(m_shader, GL_COMPILE_STATUS, &is_compiled);
  35. if(is_compiled == GL_FALSE)
  36. {
  37. GLint max_length = 0;
  38. glGetShaderiv(m_shader, GL_INFO_LOG_LENGTH, &max_length);
  39. std::vector<GLchar> error_log(max_length);
  40. glGetShaderInfoLog(m_shader, max_length, &max_length, &error_log[0]);
  41. std::cout << (char *)error_log.data() << std::endl;
  42. glDeleteShader(m_shader);
  43. return false;
  44. }
  45. m_program = glCreateProgram();
  46. glAttachShader(m_program, m_shader);
  47. glLinkProgram(m_program);
  48. GLint is_linked = 0;
  49. glGetProgramiv(m_program, GL_LINK_STATUS, &is_linked);
  50. if(is_linked == GL_FALSE)
  51. {
  52. GLint max_length = 0;
  53. glGetProgramiv(m_program, GL_INFO_LOG_LENGTH, &max_length);
  54. std::vector<GLchar> error_log(max_length);
  55. glGetProgramInfoLog(m_program, max_length, &max_length, &error_log[0]);
  56. std::cout << (char *)error_log.data() << std::endl;
  57. glDeleteProgram(m_program);
  58. return false;
  59. }
  60. glDetachShader(m_program, m_shader);
  61. return true;
  62. }
  63. void ComputeShader::activate()
  64. {
  65. glUseProgram(m_program);
  66. }
  67. void ComputeShader::deactivate()
  68. {
  69. glUseProgram(0);
  70. }
  71. void ComputeShader::execute(int n)
  72. {
  73. glDispatchCompute(n/32 + (n % 32 ? 1 : 0), 1, 1);
  74. }
  75. void ComputeShader::wait()
  76. {
  77. glMemoryBarrier( GL_ALL_BARRIER_BITS );
  78. }
  79. bool ComputeShader::release()
  80. {
  81. if(m_shader != 0){
  82. glDeleteShader(m_shader);
  83. m_shader = 0;
  84. }
  85. if(m_program != 0){
  86. glDeleteProgram(m_program);
  87. m_program = 0;
  88. }
  89. return true;
  90. }
  91. bool ComputeShader::set_uniform(char const *name, int value)
  92. {
  93. GLint location = glGetUniformLocation(m_program, name);
  94. if(location == -1){
  95. std::cout << "Uniform " << name << " not found in program." << std::endl;
  96. return false;
  97. }
  98. glUniform1i(location, value);
  99. return true;
  100. }
  101. bool ComputeShader::set_uniform(char const *name, float value)
  102. {
  103. GLint location = glGetUniformLocation(m_program, name);
  104. if(location == -1){
  105. std::cout << "Uniform " << name << " not found in program." << std::endl;
  106. return false;
  107. }
  108. glUniform1f(location, value);
  109. return true;
  110. }