opengl.shaders: probably better to call the gl functions directly

factor-shell
Björn Lindqvist 2018-01-31 01:42:04 +01:00
parent 713543644d
commit 62f9acdbbc
3 changed files with 14 additions and 24 deletions

View File

@ -1,4 +1,5 @@
USING: help.markup help.syntax kernel quotations sequences strings ; USING: help.markup help.syntax kernel opengl.gl quotations sequences
strings ;
IN: opengl.shaders IN: opengl.shaders
HELP: (gl-program) HELP: (gl-program)
@ -12,7 +13,7 @@ HELP: (gl-program)
HELP: <gl-shader> HELP: <gl-shader>
{ $values { "source" "The GLSL source code to compile" } { "kind" "The kind of shader to compile, such as " { $snippet "GL_VERTEX_SHADER" } " or " { $snippet "GL_FRAGMENT_SHADER" } } { "shader" "a new " { $link gl-shader } } } { $values { "source" "The GLSL source code to compile" } { "kind" "The kind of shader to compile, such as " { $snippet "GL_VERTEX_SHADER" } " or " { $snippet "GL_FRAGMENT_SHADER" } } { "shader" "a new " { $link gl-shader } } }
{ $description "Tries to compile the given GLSL source into a shader object. The returned object can be checked for validity by " { $link check-gl-shader } " or " { $link gl-shader-ok? } ". Errors and warnings generated by the GLSL compiler will be collected in the info log, available from " { $link gl-shader-info-log } ".\n\nWhen the shader object is no longer needed, it should be deleted using " { $link delete-gl-shader } " or else be attached to a " { $link gl-program } " object deleted using " { $link delete-gl-program } "." } ; { $description "Tries to compile the given GLSL source into a shader object. The returned object can be checked for validity by " { $link check-gl-shader } " or " { $link gl-shader-ok? } ". Errors and warnings generated by the GLSL compiler will be collected in the info log, available from " { $link gl-shader-info-log } ".\n\nWhen the shader object is no longer needed, it should be deleted using " { $link glDeleteShader } " or else be attached to a " { $link gl-program } " object deleted using " { $link delete-gl-program } "." } ;
HELP: <vertex-shader> HELP: <vertex-shader>
{ $values { "source" "The GLSL source code to compile" } { "vertex-shader" "a new " { $link vertex-shader } } } { $values { "source" "The GLSL source code to compile" } { "vertex-shader" "a new " { $link vertex-shader } } }
@ -29,7 +30,7 @@ HELP: gl-shader
{ { $link gl-shader-ok? } " - Check whether a shader object compiled successfully" } { { $link gl-shader-ok? } " - Check whether a shader object compiled successfully" }
{ { $link check-gl-shader } " - Throw an error unless a shader object compiled successfully" } { { $link check-gl-shader } " - Throw an error unless a shader object compiled successfully" }
{ { $link gl-shader-info-log } " - Retrieve the info log of messages generated by the GLSL compiler" } { { $link gl-shader-info-log } " - Retrieve the info log of messages generated by the GLSL compiler" }
{ { $link delete-gl-shader } " - Invalidate a shader object" } { { $link glDeleteShader } } " - Invalidate a shader object" }
} }
"The derived predicate classes " { $link vertex-shader } " and " { $link fragment-shader } " are also defined for the two standard kinds of shader defined by the OpenGL specification." } ; "The derived predicate classes " { $link vertex-shader } " and " { $link fragment-shader } " are also defined for the two standard kinds of shader defined by the OpenGL specification." } ;
@ -55,10 +56,6 @@ HELP: check-gl-shader
{ $values { "shader" "A " { $link gl-shader } " object" } } { $values { "shader" "A " { $link gl-shader } " object" } }
{ $description "Throws an error containing the " { $link gl-shader-info-log } " for the shader object if it failed to compile. Otherwise, the shader object is left on the stack." } ; { $description "Throws an error containing the " { $link gl-shader-info-log } " for the shader object if it failed to compile. Otherwise, the shader object is left on the stack." } ;
HELP: delete-gl-shader
{ $values { "shader" "A " { $link gl-shader } " object" } }
{ $description "Deletes the shader object, invalidating it and releasing any resources allocated for it by the OpenGL implementation." } ;
HELP: gl-shader-info-log HELP: gl-shader-info-log
{ $values { "shader" "A " { $link gl-shader } " object" } { "log" string } } { $values { "shader" "A " { $link gl-shader } " object" } { "log" string } }
{ $description "Retrieves the info log for " { $snippet "shader" } ", including any errors or warnings generated in compiling the shader object." } ; { $description "Retrieves the info log for " { $snippet "shader" } ", including any errors or warnings generated in compiling the shader object." } ;
@ -100,7 +97,7 @@ HELP: gl-program-info-log
HELP: delete-gl-program HELP: delete-gl-program
{ $values { "program" "A " { $link gl-program } " object" } } { $values { "program" "A " { $link gl-program } " object" } }
{ $description "Deletes the program object, invalidating it and releasing any resources allocated for it by the OpenGL implementation. Any attached " { $link gl-shader } "s are also deleted.\n\nIf the shader objects should be preserved, they should each be detached using " { $link detach-gl-program-shader } ". The program object can then be destroyed alone using " { $link delete-gl-program-only } "." } ; { $description "Deletes the program object, invalidating it and releasing any resources allocated for it by the OpenGL implementation. Any attached " { $link gl-shader } "s are also deleted.\n\nIf the shader objects should be preserved, they should each be detached using " { $link glDetachShader } ". The program object can then be destroyed alone using " { $link glDeleteProgram } "." } ;
HELP: with-gl-program HELP: with-gl-program
{ $values { "program" "A " { $link gl-program } " object" } { "quot" "A quotation with stack effect " { $snippet "( program -- )" } } } { $values { "program" "A " { $link gl-program } " object" } { "quot" "A quotation with stack effect " { $snippet "( program -- )" } } }

View File

@ -54,8 +54,6 @@ IN: opengl.shaders
: check-gl-shader ( shader -- shader ) : check-gl-shader ( shader -- shader )
dup gl-shader-ok? [ dup gl-shader-info-log throw ] unless ; dup gl-shader-ok? [ dup gl-shader-info-log throw ] unless ;
: delete-gl-shader ( shader -- ) glDeleteShader ; inline
PREDICATE: gl-shader < integer (gl-shader?) ; PREDICATE: gl-shader < integer (gl-shader?) ;
PREDICATE: vertex-shader < gl-shader (vertex-shader?) ; PREDICATE: vertex-shader < gl-shader (vertex-shader?) ;
PREDICATE: fragment-shader < gl-shader (fragment-shader?) ; PREDICATE: fragment-shader < gl-shader (fragment-shader?) ;
@ -110,23 +108,18 @@ PREDICATE: fragment-shader < gl-shader (fragment-shader?) ;
over uint <c-array> over uint <c-array>
[ glGetAttachedShaders ] keep [ zero? ] reject ; [ glGetAttachedShaders ] keep [ zero? ] reject ;
: delete-gl-program-only ( program -- )
glDeleteProgram ; inline
: detach-gl-program-shader ( program shader -- )
glDetachShader ; inline
: delete-gl-program ( program -- ) : delete-gl-program ( program -- )
dup gl-program-shaders [ dup gl-program-shaders [
2dup detach-gl-program-shader delete-gl-shader 2dup glDetachShader glDeleteShader
] each delete-gl-program-only ; ] each glDeleteProgram ;
: with-gl-program ( program quot -- ) : with-gl-program ( program quot -- )
over glUseProgram [ 0 glUseProgram ] [ ] cleanup ; inline over glUseProgram [ 0 glUseProgram ] [ ] cleanup ; inline
PREDICATE: gl-program < integer (gl-program?) ; PREDICATE: gl-program < integer (gl-program?) ;
: <simple-gl-program> ( vertex-shader-source fragment-shader-source -- program ) : <simple-gl-program> ( vertex-shader-source fragment-shader-source
-- program )
[ <vertex-shader> check-gl-shader ] [ <vertex-shader> check-gl-shader ]
[ <fragment-shader> check-gl-shader ] bi* [ <fragment-shader> check-gl-shader ] bi*
2array <gl-program> check-gl-program ; 2array <gl-program> check-gl-program ;

View File

@ -456,7 +456,7 @@ TUPLE: compile-shader-error shader log ;
TUPLE: link-program-error program log ; TUPLE: link-program-error program log ;
: throw-compile-shader-error ( shader instance -- * ) : throw-compile-shader-error ( shader instance -- * )
[ dup ] dip [ gl-shader-info-log ] [ delete-gl-shader ] bi [ dup ] dip [ gl-shader-info-log ] [ glDeleteShader ] bi
replace-log-line-numbers compile-shader-error boa throw ; replace-log-line-numbers compile-shader-error boa throw ;
: throw-link-program-error ( program instance -- * ) : throw-link-program-error ( program instance -- * )
@ -501,7 +501,7 @@ DEFER: <shader-instance>
pick word-directory prepend-path ; pick word-directory prepend-path ;
: become-shader-instance ( shader-instance new-shader-instance -- ) : become-shader-instance ( shader-instance new-shader-instance -- )
handle>> [ swap delete-gl-shader ] curry change-handle drop ; handle>> [ swap glDeleteShader ] curry change-handle drop ;
: refresh-shader-source ( shader -- ) : refresh-shader-source ( shader -- )
dup filename>> dup filename>>
@ -509,7 +509,7 @@ DEFER: <shader-instance>
[ drop ] if* ; [ drop ] if* ;
: become-program-instance ( program-instance new-program-instance -- ) : become-program-instance ( program-instance new-program-instance -- )
handle>> [ swap delete-gl-program-only ] curry change-handle drop ; handle>> [ swap glDeleteProgram ] curry change-handle drop ;
: reset-memos ( -- ) : reset-memos ( -- )
\ uniform-index reset-memoized \ uniform-index reset-memoized
@ -625,11 +625,11 @@ SYNTAX: GLSL-PROGRAM:
define-constant ; define-constant ;
M: shader-instance dispose M: shader-instance dispose
[ dup valid-handle? [ delete-gl-shader ] [ drop ] if f ] change-handle [ dup valid-handle? [ glDeleteShader ] [ drop ] if f ] change-handle
[ world>> ] [ shader>> instances>> ] [ ] tri ?delete-at ; [ world>> ] [ shader>> instances>> ] [ ] tri ?delete-at ;
M: program-instance dispose M: program-instance dispose
[ dup valid-handle? [ delete-gl-program-only ] [ drop ] if f ] change-handle [ dup valid-handle? [ glDeleteProgram ] [ drop ] if f ] change-handle
[ world>> ] [ program>> instances>> ] [ ] tri ?delete-at [ world>> ] [ program>> instances>> ] [ ] tri ?delete-at
reset-memos ; reset-memos ;