@ -762,7 +762,7 @@ RLAPI unsigned char *rlReadScreenPixels(int width, int height); // Rea
/ / Framebuffer management ( fbo )
RLAPI unsigned int rlLoadFramebuffer ( void ) ; / / Load an empty framebuffer
RLAPI void rlFramebufferAttach ( unsigned int fboI d, unsigned int texId , int attachType , int texType , int mipLevel ) ; / / Attach texture / renderbuffer to a framebuffer
RLAPI void rlFramebufferAttach ( unsigned int i d, unsigned int texId , int attachType , int texType , int mipLevel ) ; / / Attach texture / renderbuffer to a framebuffer
RLAPI bool rlFramebufferComplete ( unsigned int id ) ; / / Verify framebuffer is complete
RLAPI void rlUnloadFramebuffer ( unsigned int id ) ; / / Delete framebuffer from GPU
/ / WARNING : Copy and resize framebuffer functionality only defined for software backend
@ -770,13 +770,14 @@ RLAPI void rlCopyFramebuffer(int x, int y, int width, int height, int format, vo
RLAPI void rlResizeFramebuffer ( int width , int height ) ; / / Resize internal framebuffer
/ / Shaders management
RLAPI unsigned int rlLoadShaderCode ( const char * vsCode , const char * fsCode ) ; / / Load shader from code strings
RLAPI unsigned int rlCompileShader ( const char * shaderCode , int type ) ; / / Compile custom shader and return shader id ( type : RL_VERTEX_SHADER , RL_FRAGMENT_SHADER , RL_COMPUTE_SHADER )
RLAPI void rlUnloadShader ( unsigned int id ) ; / / Unload shader , loaded with rlCompileShader ( )
RLAPI unsigned int rlLoadShaderProgram ( unsigned int vShaderId , unsigned int fShaderId ) ; / / Load custom shader program
RLAPI unsigned int rlLoadShader ( const char * code , int type ) ; / / Load ( compile ) shader and return shader id ( type : RL_VERTEX_SHADER , RL_FRAGMENT_SHADER , RL_COMPUTE_SHADER )
RLAPI unsigned int rlLoadShaderProgram ( const char * vsCode , const char * fsCode ) ; / / Load shader from code strings
RLAPI unsigned int rlLoadShaderProgramEx ( unsigned int vsId , unsigned int fsId ) ; / / Load shader program , using already loaded shader ids
RLAPI unsigned int rlLoadShaderProgramCompute ( unsigned int csId ) ; / / Load compute shader program
RLAPI void rlUnloadShader ( unsigned int id ) ; / / Unload shader , loaded with rlLoadShader ( )
RLAPI void rlUnloadShaderProgram ( unsigned int id ) ; / / Unload shader program
RLAPI int rlGetLocationUniform ( unsigned int shaderI d, const char * uniformName ) ; / / Get shader location uniform , requires shader program id
RLAPI int rlGetLocationAttrib ( unsigned int shaderI d, const char * attribName ) ; / / Get shader location attribute , requires shader program id
RLAPI int rlGetLocationUniform ( unsigned int i d, const char * uniformName ) ; / / Get shader location uniform , requires shader program id
RLAPI int rlGetLocationAttrib ( unsigned int i d, const char * attribName ) ; / / Get shader location attribute , requires shader program id
RLAPI void rlSetUniform ( int locIndex , const void * value , int uniformType , int count ) ; / / Set shader value uniform
RLAPI void rlSetUniformMatrix ( int locIndex , Matrix mat ) ; / / Set shader value matrix
RLAPI void rlSetUniformMatrices ( int locIndex , const Matrix * mat , int count ) ; / / Set shader value matrices
@ -784,7 +785,6 @@ RLAPI void rlSetUniformSampler(int locIndex, unsigned int textureId);
RLAPI void rlSetShader ( unsigned int id , int * locs ) ; / / Set shader currently active ( id and locations )
/ / Compute shader management
RLAPI unsigned int rlLoadComputeShaderProgram ( unsigned int shaderId ) ; / / Load compute shader program
RLAPI void rlComputeShaderDispatch ( unsigned int groupX , unsigned int groupY , unsigned int groupZ ) ; / / Dispatch compute shader ( equivalent to * draw * for graphics pipeline )
/ / Shader buffer storage object management ( ssbo )
@ -3837,12 +3837,12 @@ unsigned int rlLoadFramebuffer(void)
return fboId ;
}
/ / Attach color buffer texture to an fbo ( unloads previous attachment )
/ / Attach color buffer texture to a frame buffer object ( unloads previous attachment )
/ / NOTE : Attach type : 0 - Color , 1 - Depth renderbuffer , 2 - Depth texture
void rlFramebufferAttach ( unsigned int fboI d, unsigned int texId , int attachType , int texType , int mipLevel )
void rlFramebufferAttach ( unsigned int i d, unsigned int texId , int attachType , int texType , int mipLevel )
{
# if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2))
glBindFramebuffer ( GL_FRAMEBUFFER , fboI d) ;
glBindFramebuffer ( GL_FRAMEBUFFER , i d) ;
switch ( attachType )
{
@ -4179,9 +4179,74 @@ void rlUnloadVertexBuffer(unsigned int vboId)
/ / Shaders management
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / Load shader from code strings
/ / Load ( compile ) shader and return shader id
unsigned int rlLoadShader ( const char * code , int type )
{
unsigned int shaderId = 0 ;
# if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
shaderId = glCreateShader ( type ) ;
glShaderSource ( shaderId , 1 , & code , NULL ) ;
GLint success = 0 ;
glCompileShader ( shaderId ) ;
glGetShaderiv ( shaderId , GL_COMPILE_STATUS , & success ) ;
if ( success = = GL_FALSE )
{
switch ( type )
{
case GL_VERTEX_SHADER : TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Failed to compile vertex shader code " , shaderId ) ; break ;
case GL_FRAGMENT_SHADER : TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Failed to compile fragment shader code " , shaderId ) ; break ;
/ / case GL_GEOMETRY_SHADER :
# if defined(GRAPHICS_API_OPENGL_43)
case GL_COMPUTE_SHADER : TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Failed to compile compute shader code " , shaderId ) ; break ;
# elif defined(GRAPHICS_API_OPENGL_33)
case GL_COMPUTE_SHADER : TRACELOG ( RL_LOG_WARNING , " SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43 " , shaderId ) ; break ;
# endif
default : break ;
}
int maxLength = 0 ;
glGetShaderiv ( shaderId , GL_INFO_LOG_LENGTH , & maxLength ) ;
if ( maxLength > 0 )
{
int length = 0 ;
char * log = ( char * ) RL_CALLOC ( maxLength , sizeof ( char ) ) ;
glGetShaderInfoLog ( shaderId , maxLength , & length , log ) ;
TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Compile error: %s " , shaderId , log ) ;
RL_FREE ( log ) ;
}
/ / Unload object allocated by glCreateShader ( ) ,
/ / despite failing in the compilation process
glDeleteShader ( shaderId ) ;
shaderId = 0 ;
}
else
{
switch ( type )
{
case GL_VERTEX_SHADER : TRACELOG ( RL_LOG_INFO , " SHADER: [ID %i] Vertex shader compiled successfully " , shaderId ) ; break ;
case GL_FRAGMENT_SHADER : TRACELOG ( RL_LOG_INFO , " SHADER: [ID %i] Fragment shader compiled successfully " , shaderId ) ; break ;
/ / case GL_GEOMETRY_SHADER :
# if defined(GRAPHICS_API_OPENGL_43)
case GL_COMPUTE_SHADER : TRACELOG ( RL_LOG_INFO , " SHADER: [ID %i] Compute shader compiled successfully " , shaderId ) ; break ;
# elif defined(GRAPHICS_API_OPENGL_33)
case GL_COMPUTE_SHADER : TRACELOG ( RL_LOG_WARNING , " SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43 " , shaderId ) ; break ;
# endif
default : break ;
}
}
# endif
return shaderId ;
}
/ / Load shader program from code strings
/ / NOTE : If shader string is NULL , using default vertex / fragment shaders
unsigned int rlLoadShaderCode ( const char * vsCode , const char * fsCode )
unsigned int rlLoadShaderProgram ( const char * vsCode , const char * fsCode )
{
unsigned int id = 0 ; / / Shader program id
if ( ! isGpuReady ) { TRACELOG ( RL_LOG_WARNING , " GL: GPU is not ready to load data, trying to load before InitWindow()? " ) ; return id ; }
@ -4192,12 +4257,12 @@ unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode)
/ / Compile vertex shader ( if provided )
/ / NOTE : If not vertex shader is provided , use default one
if ( vsCode ! = NULL ) vertexShaderId = rlCompile Shader ( vsCode , GL_VERTEX_SHADER ) ;
if ( vsCode ! = NULL ) vertexShaderId = rlLoad Shader ( vsCode , GL_VERTEX_SHADER ) ;
else vertexShaderId = RLGL . State . defaultVShaderId ;
/ / Compile fragment shader ( if provided )
/ / NOTE : If not vertex shader is provided , use default one
if ( fsCode ! = NULL ) fragmentShaderId = rlCompile Shader ( fsCode , GL_FRAGMENT_SHADER ) ;
if ( fsCode ! = NULL ) fragmentShaderId = rlLoad Shader ( fsCode , GL_FRAGMENT_SHADER ) ;
else fragmentShaderId = RLGL . State . defaultFShaderId ;
/ / In case vertex and fragment shader are the default ones , no need to recompile , assign the default shader program id
@ -4205,7 +4270,7 @@ unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode)
else if ( ( vertexShaderId > 0 ) & & ( fragmentShaderId > 0 ) )
{
/ / One of or both shader are new , a new shader program needs to be compiled
id = rlLoadShaderProgram ( vertexShaderId , fragmentShaderId ) ;
id = rlLoadShaderProgramEx ( vertexShaderId , fragmentShaderId ) ;
/ / Detaching and deleting vertex / fragment shaders ( if not default ones )
/ / WARNING : Detach shader before deletion to make sure memory is freed
@ -4258,96 +4323,81 @@ unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode)
return id ;
}
/ / Compile custom shader and return shader id
unsigned int rlCompileShader ( const char * shaderCode , int type )
/ / Load shader program from already loaded shader ids
unsigned int rlLoadShaderProgramEx ( unsigned int vsId , unsigned int fsId )
{
unsigned int shaderId = 0 ;
unsigned int programId = 0 ;
if ( ! isGpuReady ) { TRACELOG ( RL_LOG_WARNING , " GL: GPU is not ready to load data, trying to load before InitWindow()? " ) ; return programId ; }
# if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
shaderId = glCreateShader ( type ) ;
glShaderSource ( shaderId , 1 , & shaderCode , NULL ) ;
GLint success = 0 ;
glCompileShader ( shaderId ) ;
glGetShaderiv ( shaderId , GL_COMPILE_STATUS , & success ) ;
programId = glCreateProgram ( ) ;
glAttachShader ( programId , vsId ) ;
glAttachShader ( programId , fsId ) ;
/ / Default attribute shader locations must be bound before linking
/ / NOTE : There is no problem with binding a generic attribute index to an attribute variable name
/ / that is never used ; if some attrib name is no found on the shader , it locations becomes - 1
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION , RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD , RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL , RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR , RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT , RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 , RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCETRANSFORM , RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCETRANSFORM ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES , RL_DEFAULT_SHADER_ATTRIB_NAME_BONEINDICES ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS , RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS ) ;
glLinkProgram ( programId ) ;
/ / NOTE : All uniform variables are intitialised to 0 when a program links
glGetProgramiv ( programId , GL_LINK_STATUS , & success ) ;
if ( success = = GL_FALSE )
{
switch ( type )
{
case GL_VERTEX_SHADER : TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Failed to compile vertex shader code " , shaderId ) ; break ;
case GL_FRAGMENT_SHADER : TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Failed to compile fragment shader code " , shaderId ) ; break ;
/ / case GL_GEOMETRY_SHADER :
# if defined(GRAPHICS_API_OPENGL_43)
case GL_COMPUTE_SHADER : TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Failed to compile compute shader code " , shaderId ) ; break ;
# elif defined(GRAPHICS_API_OPENGL_33)
case GL_COMPUTE_SHADER : TRACELOG ( RL_LOG_WARNING , " SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43 " , shaderId ) ; break ;
# endif
default : break ;
}
TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Failed to link shader program " , programId ) ;
int maxLength = 0 ;
glGetShaderiv ( shaderId , GL_INFO_LOG_LENGTH , & maxLength ) ;
glGetProgramiv ( programId , GL_INFO_LOG_LENGTH , & maxLength ) ;
if ( maxLength > 0 )
{
int length = 0 ;
char * log = ( char * ) RL_CALLOC ( maxLength , sizeof ( char ) ) ;
glGetShaderInfoLog ( shader Id , maxLength , & length , log ) ;
TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Compile error: %s " , shader Id , log ) ;
glGetProgramInfoLog ( programId , maxLength , & length , log ) ;
TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Link error: %s " , programId , log ) ;
RL_FREE ( log ) ;
}
/ / Unload object allocated by glCreateShader ( ) ,
/ / despite failing in the compilation process
glDeleteShader ( shaderId ) ;
shaderId = 0 ;
glDeleteProgram ( programId ) ;
programId = 0 ;
}
else
{
switch ( type )
{
case GL_VERTEX_SHADER : TRACELOG ( RL_LOG_INFO , " SHADER: [ID %i] Vertex shader compiled successfully " , shaderId ) ; break ;
case GL_FRAGMENT_SHADER : TRACELOG ( RL_LOG_INFO , " SHADER: [ID %i] Fragment shader compiled successfully " , shaderId ) ; break ;
/ / case GL_GEOMETRY_SHADER :
# if defined(GRAPHICS_API_OPENGL_43)
case GL_COMPUTE_SHADER : TRACELOG ( RL_LOG_INFO , " SHADER: [ID %i] Compute shader compiled successfully " , shaderId ) ; break ;
# elif defined(GRAPHICS_API_OPENGL_33)
case GL_COMPUTE_SHADER : TRACELOG ( RL_LOG_WARNING , " SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43 " , shaderId ) ; break ;
# endif
default : break ;
}
/ / Get the size of compiled shader program ( not available on OpenGL ES 2.0 )
/ / NOTE : If GL_LINK_STATUS is GL_FALSE , program binary length is zero
/ / GLint binarySize = 0 ;
/ / glGetProgramiv ( id , GL_PROGRAM_BINARY_LENGTH , & binarySize ) ;
TRACELOG ( RL_LOG_INFO , " SHADER: [ID %i] Program shader loaded successfully " , programId ) ;
}
# endif
return shaderId ;
return programId ;
}
/ / Load custom shader strings and return program id
unsigned int rlLoadShaderProgram( unsigned int vShaderId , unsigned int fShader Id )
/ / Load compute shader program
unsigned int rlLoadShaderProgramCompute ( unsigned int cs Id )
{
unsigned int programId = 0 ;
if ( ! isGpuReady ) { TRACELOG ( RL_LOG_WARNING , " GL: GPU is not ready to load data, trying to load before InitWindow()? " ) ; return programId ; }
# if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2 )
# if defined(GRAPHICS_API_OPENGL_43 )
GLint success = 0 ;
programId = glCreateProgram ( ) ;
glAttachShader ( programId , vShaderId ) ;
glAttachShader ( programId , fShaderId ) ;
/ / Default attribute shader locations must be bound before linking
/ / NOTE : There is no problem with binding a generic attribute index to an attribute variable name
/ / that is never used ; if some attrib name is no found on the shader , it locations becomes - 1
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION , RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD , RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL , RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR , RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT , RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 , RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCETRANSFORM , RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCETRANSFORM ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES , RL_DEFAULT_SHADER_ATTRIB_NAME_BONEINDICES ) ;
glBindAttribLocation ( programId , RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS , RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS ) ;
glAttachShader ( programId , csId ) ;
glLinkProgram ( programId ) ;
@ -4357,7 +4407,7 @@ unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId)
if ( success = = GL_FALSE )
{
TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Failed to link shader program " , programId ) ;
TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Failed to link compute shader program " , programId ) ;
int maxLength = 0 ;
glGetProgramiv ( programId , GL_INFO_LOG_LENGTH , & maxLength ) ;
@ -4382,20 +4432,13 @@ unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId)
/ / GLint binarySize = 0 ;
/ / glGetProgramiv ( id , GL_PROGRAM_BINARY_LENGTH , & binarySize ) ;
TRACELOG ( RL_LOG_INFO , " SHADER: [ID %i] Program shader loaded successfully " , programId ) ;
TRACELOG ( RL_LOG_INFO , " SHADER: [ID %i] Compute shader program loaded successfully " , programId ) ;
}
# else
TRACELOG ( RL_LOG_WARNING , " SHADER: Compute shaders not supported, enable GRAPHICS_API_OPENGL_43 " ) ;
# endif
return programId ;
}
/ / Unload shader program
void rlUnloadShaderProgram ( unsigned int id )
{
# if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
glDeleteProgram ( id ) ;
TRACELOG ( RL_LOG_INFO , " SHADER: [ID %i] Unloaded shader program data from VRAM (GPU) " , id ) ;
# endif
return programId ;
}
/ / Delete shader
@ -4408,13 +4451,23 @@ void rlUnloadShader(unsigned int id)
# endif
}
/ / Unload shader program
void rlUnloadShaderProgram ( unsigned int id )
{
# if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
glDeleteProgram ( id ) ;
TRACELOG ( RL_LOG_INFO , " SHADER: [ID %i] Unloaded shader program data from VRAM (GPU) " , id ) ;
# endif
}
/ / Get shader location uniform
/ / NOTE : First parameter refers to shader program id
int rlGetLocationUniform ( unsigned int shaderId , const char * uniformName )
int rlGetLocationUniform ( unsigned int i d, const char * uniformName )
{
int location = - 1 ;
# if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
location = glGetUniformLocation ( shaderId , uniformName ) ;
location = glGetUniformLocation ( i d, uniformName ) ;
/ / if ( location = = - 1 ) TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Failed to find shader uniform: %s " , shaderId , uniformName ) ;
/ / else TRACELOG ( RL_LOG_INFO , " SHADER: [ID %i] Shader uniform (%s) set at location: %i " , shaderId , uniformName , location ) ;
@ -4424,11 +4477,11 @@ int rlGetLocationUniform(unsigned int shaderId, const char *uniformName)
/ / Get shader location attribute
/ / NOTE : First parameter refers to shader program id
int rlGetLocationAttrib ( unsigned int shaderI d, const char * attribName )
int rlGetLocationAttrib ( unsigned int i d, const char * attribName )
{
int location = - 1 ;
# if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
location = glGetAttribLocation ( shaderI d, attribName ) ;
location = glGetAttribLocation ( i d, attribName ) ;
/ / if ( location = = - 1 ) TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Failed to find shader attribute: %s " , shaderId , attribName ) ;
/ / else TRACELOG ( RL_LOG_INFO , " SHADER: [ID %i] Shader attribute (%s) set at location: %i " , shaderId , attribName , location ) ;
@ -4538,57 +4591,6 @@ void rlSetShader(unsigned int id, int *locs)
# endif
}
/ / Load compute shader program
unsigned int rlLoadComputeShaderProgram ( unsigned int shaderId )
{
unsigned int programId = 0 ;
# if defined(GRAPHICS_API_OPENGL_43)
GLint success = 0 ;
programId = glCreateProgram ( ) ;
glAttachShader ( programId , shaderId ) ;
glLinkProgram ( programId ) ;
/ / NOTE : All uniform variables are intitialised to 0 when a program links
glGetProgramiv ( programId , GL_LINK_STATUS , & success ) ;
if ( success = = GL_FALSE )
{
TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Failed to link compute shader program " , programId ) ;
int maxLength = 0 ;
glGetProgramiv ( programId , GL_INFO_LOG_LENGTH , & maxLength ) ;
if ( maxLength > 0 )
{
int length = 0 ;
char * log = ( char * ) RL_CALLOC ( maxLength , sizeof ( char ) ) ;
glGetProgramInfoLog ( programId , maxLength , & length , log ) ;
TRACELOG ( RL_LOG_WARNING , " SHADER: [ID %i] Link error: %s " , programId , log ) ;
RL_FREE ( log ) ;
}
glDeleteProgram ( programId ) ;
programId = 0 ;
}
else
{
/ / Get the size of compiled shader program ( not available on OpenGL ES 2.0 )
/ / NOTE : If GL_LINK_STATUS is GL_FALSE , program binary length is zero
/ / GLint binarySize = 0 ;
/ / glGetProgramiv ( id , GL_PROGRAM_BINARY_LENGTH , & binarySize ) ;
TRACELOG ( RL_LOG_INFO , " SHADER: [ID %i] Compute shader program loaded successfully " , programId ) ;
}
# else
TRACELOG ( RL_LOG_WARNING , " SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43 " ) ;
# endif
return programId ;
}
/ / Dispatch compute shader ( equivalent to * draw * for graphics pilepine )
void rlComputeShaderDispatch ( unsigned int groupX , unsigned int groupY , unsigned int groupZ )
{
@ -5081,10 +5083,10 @@ static void rlLoadShaderDefault(void)
/ / NOTE : Compiled vertex / fragment shaders are not deleted ,
/ / they are kept for re - use as default shaders in case some shader loading fails
RLGL . State . defaultVShaderId = rlCompile Shader ( defaultVShaderCode , GL_VERTEX_SHADER ) ; / / Compile default vertex shader
RLGL . State . defaultFShaderId = rlCompile Shader ( defaultFShaderCode , GL_FRAGMENT_SHADER ) ; / / Compile default fragment shader
RLGL . State . defaultVShaderId = rlLoad Shader ( defaultVShaderCode , GL_VERTEX_SHADER ) ; / / Compile default vertex shader
RLGL . State . defaultFShaderId = rlLoad Shader ( defaultFShaderCode , GL_FRAGMENT_SHADER ) ; / / Compile default fragment shader
RLGL . State . defaultShaderId = rlLoadShaderProgram ( RLGL . State . defaultVShaderId , RLGL . State . defaultFShaderId ) ;
RLGL . State . defaultShaderId = rlLoadShaderProgramEx ( RLGL . State . defaultVShaderId , RLGL . State . defaultFShaderId ) ;
if ( RLGL . State . defaultShaderId > 0 )
{