diff --git a/extra/gpu/buffers/buffers.factor b/extra/gpu/buffers/buffers.factor index 187f194e7d..ce53a25422 100644 --- a/extra/gpu/buffers/buffers.factor +++ b/extra/gpu/buffers/buffers.factor @@ -54,6 +54,12 @@ TUPLE: buffer < gpu-object { pixel-pack-buffer [ GL_PIXEL_PACK_BUFFER ] } } case ; inline +: get-buffer-int ( target enum -- value ) + 0 [ glGetBufferParameteriv ] keep *int ; + +: bind-buffer ( buffer -- target ) + [ kind>> gl-target dup ] [ handle>> glBindBuffer ] bi ; + PRIVATE> M: buffer dispose @@ -64,11 +70,17 @@ TUPLE: buffer-ptr { offset integer read-only } ; C: buffer-ptr +TUPLE: buffer-range < buffer-ptr + { size integer read-only } ; +C: buffer-range + UNION: gpu-data-ptr buffer-ptr c-ptr ; +: buffer-size ( buffer -- size ) + bind-buffer GL_BUFFER_SIZE get-buffer-int ; + :: allocate-buffer ( buffer size initial-data -- ) - buffer kind>> gl-target :> target - target buffer handle>> glBindBuffer + buffer bind-buffer :> target target size initial-data buffer gl-buffer-usage glBufferData ; : ( upload usage kind size initial-data -- buffer ) @@ -81,15 +93,13 @@ UNION: gpu-data-ptr buffer-ptr c-ptr ; :: update-buffer ( buffer-ptr size data -- ) buffer-ptr buffer>> :> buffer - buffer kind>> gl-target :> target - target buffer handle>> glBindBuffer + buffer bind-buffer :> target target buffer-ptr offset>> size data glBufferSubData ; :: read-buffer ( buffer-ptr size -- data ) buffer-ptr buffer>> :> buffer - buffer kind>> gl-target :> target + buffer bind-buffer :> target size :> data - target buffer handle>> glBindBuffer target buffer-ptr offset>> size data glGetBufferSubData data ; @@ -102,9 +112,7 @@ UNION: gpu-data-ptr buffer-ptr c-ptr ; size glCopyBufferSubData ; :: with-mapped-buffer ( buffer access quot: ( alien -- ) -- ) - buffer kind>> gl-target :> target - - target buffer handle>> glBindBuffer + buffer bind-buffer :> target target access gl-access glMapBuffer quot call diff --git a/extra/gpu/render/render.factor b/extra/gpu/render/render.factor index 3d2fef3807..6ea72d53a5 100644 --- a/extra/gpu/render/render.factor +++ b/extra/gpu/render/render.factor @@ -386,33 +386,6 @@ TR: hyphens>underscores "-" "_" ; ] } } case ; -: component-type>c-type ( component-type -- c-type ) - { - { ubyte-components [ "uchar" ] } - { ushort-components [ "ushort" ] } - { uint-components [ "uint" ] } - { half-components [ "half" ] } - { float-components [ "float" ] } - { byte-integer-components [ "char" ] } - { ubyte-integer-components [ "uchar" ] } - { short-integer-components [ "short" ] } - { ushort-integer-components [ "ushort" ] } - { int-integer-components [ "int" ] } - { uint-integer-components [ "uint" ] } - } case ; - -: c-array-dim ( dim -- string ) - dup 1 = [ drop "" ] [ number>string "[" "]" surround ] if ; - -SYMBOL: padding-no -padding-no [ 0 ] initialize - -: padding-name ( -- name ) - "padding-" - padding-no get number>string append - "(" ")" surround - padding-no inc ; - : (define-uniform-tuple) ( class superclass uniforms -- ) { [ [ uniform>slot ] map define-tuple-class ] @@ -490,7 +463,7 @@ TUPLE: render-set [ framebuffer>> [ GL_DRAW_FRAMEBUFFER swap framebuffer-handle glBindFramebuffer ] - [ GL_RASTERIZER_DISCARD glEnable ] if* + [ GL_DRAW_FRAMEBUFFER 0 glBindFramebuffer GL_RASTERIZER_DISCARD glEnable ] if* ] [ [ vertex-array>> program-instance>> ] diff --git a/extra/gpu/shaders/prettyprint/prettyprint.factor b/extra/gpu/shaders/prettyprint/prettyprint.factor index 128333ce3c..3d739a55f3 100644 --- a/extra/gpu/shaders/prettyprint/prettyprint.factor +++ b/extra/gpu/shaders/prettyprint/prettyprint.factor @@ -3,10 +3,14 @@ IN: gpu.shaders.prettyprint M: compile-shader-error error. "The GLSL shader " write - [ shader>> name>> pprint-short " failed to compile." write nl ] - [ log>> write nl ] bi ; + [ shader>> name>> pprint-short " failed to compile." print ] + [ log>> print ] bi ; M: link-program-error error. "The GLSL program " write - [ shader>> name>> pprint-short " failed to link." write nl ] - [ log>> write nl ] bi ; + [ shader>> name>> pprint-short " failed to link." print ] + [ log>> print ] bi ; + +M: too-many-feedback-formats-error error. + drop + "Only one transform feedback format can be specified for a program." print ; diff --git a/extra/gpu/shaders/shaders.factor b/extra/gpu/shaders/shaders.factor index e3b4482c24..933522b3d0 100755 --- a/extra/gpu/shaders/shaders.factor +++ b/extra/gpu/shaders/shaders.factor @@ -16,6 +16,8 @@ VARIANT: shader-kind UNION: ?string string POSTPONE: f ; +ERROR: too-many-feedback-formats-error formats ; + TUPLE: vertex-attribute { name ?string read-only initial: f } { component-type component-type read-only initial: float-components } @@ -23,6 +25,7 @@ TUPLE: vertex-attribute { normalize? boolean read-only initial: f } ; MIXIN: vertex-format +UNION: ?vertex-format vertex-format POSTPONE: f ; TUPLE: shader { name word read-only initial: t } @@ -37,7 +40,7 @@ TUPLE: program { filename read-only } { line integer read-only } { shaders array read-only } - { feedback-format vertex-format read-only } + { feedback-format ?vertex-format read-only } { instances hashtable read-only } ; TUPLE: shader-instance < gpu-object @@ -316,6 +319,14 @@ DEFER: world get over instances>> at* [ nip ] [ drop link-program ] if ; +: shaders-and-feedback-format ( words -- shaders feedback-format ) + [ vertex-format? ] partition swap + [ [ def>> first ] map ] [ + dup length 1 <= + [ [ f ] [ first ] if-empty ] + [ too-many-feedback-formats-error ] if + ] bi* ; + PRIVATE> :: refresh-program ( program -- ) @@ -368,7 +379,7 @@ SYNTAX: GLSL-PROGRAM: CREATE-WORD dup f lexer get line>> - \ ; parse-until >array [ def>> first ] map + \ ; parse-until >array shaders-and-feedback-format H{ } clone program boa define-constant ; diff --git a/extra/gpu/textures/textures.factor b/extra/gpu/textures/textures.factor index 5740799fbe..c84f3a2123 100644 --- a/extra/gpu/textures/textures.factor +++ b/extra/gpu/textures/textures.factor @@ -151,7 +151,7 @@ M: cube-map-face texture-data-gl-target : get-texture-float ( target level enum -- value ) 0 [ glGetTexLevelParameterfv ] keep *float ; -: get-texture-int ( texture level enum -- value ) +: get-texture-int ( target level enum -- value ) 0 [ glGetTexLevelParameteriv ] keep *int ; : ?product ( x -- y )