@@ -123,6 +123,22 @@ static GLuint get_gto_density_program(void) {
123123 return program ;
124124}
125125
126+ static GLuint get_gto_density_grad_program (void ) {
127+ static GLuint program = 0 ;
128+ if (!program ) {
129+ GLuint shader = glCreateShader (GL_COMPUTE_SHADER );
130+ if (md_gl_shader_compile (shader , (str_t ) { (const char * )eval_gto_density_grad_comp , eval_gto_density_grad_comp_size }, 0 , 0 )) {
131+ GLuint prog = glCreateProgram ();
132+ if (md_gl_program_attach_and_link (prog , & shader , 1 )) {
133+ program = prog ;
134+ }
135+ }
136+ glDeleteShader (shader );
137+ }
138+ return program ;
139+ }
140+
141+
126142static GLuint get_buffer (size_t size ) {
127143 GLuint id = 0 ;
128144 glCreateBuffers (1 , & id );
@@ -347,7 +363,7 @@ void md_gto_grid_evaluate_GPU(uint32_t vol_tex, const md_grid_t* vol_grid, const
347363 md_gto_grid_evaluate_orb_GPU (vol_tex , vol_grid , & orb , mode );
348364}
349365
350- void md_gto_grid_evaluate_matrix_GPU (uint32_t vol_tex , const md_grid_t * grid , const md_gto_data_t * gto_data , const float * upper_triangular_matrix_data , size_t matrix_dim ) {
366+ void md_gto_grid_evaluate_matrix_GPU (uint32_t vol_tex , const md_grid_t * grid , const md_gto_data_t * gto_data , const float * upper_triangular_matrix_data , size_t matrix_dim , bool output_gradients_and_value ) {
351367 ASSERT (grid );
352368 ASSERT (gto_data );
353369 ASSERT (upper_triangular_matrix_data );
@@ -364,17 +380,33 @@ void md_gto_grid_evaluate_matrix_GPU(uint32_t vol_tex, const md_grid_t* grid, co
364380 glGetTexLevelParameteriv (GL_TEXTURE_3D , 0 , GL_TEXTURE_INTERNAL_FORMAT , & format );
365381 glBindTexture (GL_TEXTURE_3D , 0 );
366382
367- switch (format ) {
368- case GL_R16F :
369- case GL_R32F :
370- break ;
371- default :
372- // Not good
373- MD_LOG_ERROR ("Unrecognized internal format of supplied volume texture" );
374- goto done ;
383+
384+ GLuint program = 0 ;
385+ if (output_gradients_and_value ) {
386+ switch (format ) {
387+ case GL_RGBA16F :
388+ case GL_RGBA32F :
389+ break ;
390+ default :
391+ // Not good
392+ MD_LOG_ERROR ("Unrecognized internal format of supplied volume texture" );
393+ goto done ;
394+ }
395+ program = get_gto_density_grad_program ();
396+ }
397+ else {
398+ switch (format ) {
399+ case GL_R16F :
400+ case GL_R32F :
401+ break ;
402+ default :
403+ // Not good
404+ MD_LOG_ERROR ("Unrecognized internal format of supplied volume texture" );
405+ goto done ;
406+ }
407+ program = get_gto_density_program ();
375408 }
376409
377- GLuint program = get_gto_density_program ();
378410 if (!program ) {
379411 MD_LOG_ERROR ("Program not found?!" );
380412 goto done ;
@@ -507,7 +539,7 @@ void md_gto_grid_evaluate_GPU(uint32_t vol_tex, const md_grid_t* vol_grid, const
507539
508540}
509541
510- void md_gto_grid_evaluate_matrix_GPU (uint32_t vol_tex , const md_grid_t * grid , const md_gto_data_t * gto_data , const float * matrix_data , size_t matrix_dim ) {
542+ void md_gto_grid_evaluate_matrix_GPU (uint32_t vol_tex , const md_grid_t * grid , const md_gto_data_t * gto_data , const float * matrix_data , size_t matrix_dim , bool output_grad_and_value ) {
511543
512544}
513545
0 commit comments