@@ -75,30 +75,25 @@ func (b *Batcher) runBinop(binopBody string, cfg ComputeConfig, dst, A, B []floa
7575func (lines * Lines2DGPU ) evaluate (pos []ms2.Vec , dist []float32 , userData any ) (err error ) {
7676 if len (pos ) != len (dist ) {
7777 return errors .New ("position and distance buffer length mismatch" )
78- } else if lines .shader == "" {
79- return errors .New ("need to initialize LinesGPU before first use " )
78+ } else if lines .prog . ID () == 0 {
79+ return errors .New ("program id is 0, did you configure Lines2DGPU? " )
8080 }
81- prog , err := glgl .CompileProgram (glgl.ShaderSource {Compute : lines .shader })
82- if err != nil {
83- return fmt .Errorf ("compiling GL program: %w" , err )
84- }
85- defer prog .Delete ()
81+ prog := lines .prog
8682 prog .Bind ()
83+ defer prog .Unbind ()
8784 loc , err := prog .UniformLocation ("WidthOffset\x00 " )
8885 if err != nil {
8986 return err
9087 }
91- prog .SetUniformf (loc , lines .Width / 2 )
92- err = glgl .Err ()
88+ err = prog .SetUniformf (loc , lines .Width / 2 )
9389 if err != nil {
94- return fmt . Errorf ( "binding LinesGPU program: %w" , err )
90+ return err
9591 }
96- defer prog . Unbind ()
92+
9793 var p runtime.Pinner
9894 ssbo := loadSSBO (lines .Lines , 2 , gl .STATIC_DRAW )
99- err = glgl .Err ()
100- if err != nil {
101- return err
95+ if ssbo == 0 {
96+ return glErrOrMessage ("loading lines SSBO got zero id" )
10297 }
10398 p .Pin (& ssbo )
10499 defer p .Unpin ()
@@ -114,19 +109,16 @@ func (lines *Lines2DGPU) evaluate(pos []ms2.Vec, dist []float32, userData any) (
114109func (poly * PolygonGPU ) evaluate (pos []ms2.Vec , dist []float32 , userData any ) (err error ) {
115110 if len (pos ) != len (dist ) {
116111 return errors .New ("position and distance buffer length mismatch" )
112+ } else if poly .prog .ID () == 0 {
113+ return errors .New ("bad program compile or PolygonGPU not initialized before first use" )
117114 }
118115 prog := poly .prog
119116 prog .Bind ()
120- err = glgl .Err ()
121- if err != nil {
122- return fmt .Errorf ("binding PolygonGPU program: %w" , err )
123- }
124117 defer prog .Unbind ()
125118 var p runtime.Pinner
126119 ssbo := loadSSBO (poly .Vertices , 2 , gl .STATIC_DRAW )
127- err = glgl .Err ()
128- if err != nil {
129- return err
120+ if ssbo == 0 {
121+ return glErrOrMessage ("loading polygon vertices SSBO" )
130122 }
131123 p .Pin (& ssbo )
132124 defer p .Unpin ()
@@ -141,27 +133,17 @@ func (poly *PolygonGPU) evaluate(pos []ms2.Vec, dist []float32, userData any) (e
141133func (lines * DisplaceMulti2D ) evaluate (pos []ms2.Vec , dist []float32 , userData any ) (err error ) {
142134 if len (pos ) != len (dist ) {
143135 return errors .New ("position and distance buffer length mismatch" )
144- } else if len ( lines .shader ) == 0 {
145- return errors .New ("need to initialize LinesGPU before first use" )
136+ } else if lines .prog . ID ( ) == 0 {
137+ return errors .New ("bad compile or need to initialize LinesGPU before first use" )
146138 }
147- cmp := unsafe .String (& lines .shader [0 ], len (lines .shader ))
148- prog , err := glgl .CompileProgram (glgl.ShaderSource {Compute : cmp })
149- if err != nil {
150- return fmt .Errorf ("compiling GL program: %w" , err )
151- }
152- defer prog .Delete ()
153- prog .Bind ()
154139
155- err = glgl .Err ()
156- if err != nil {
157- return fmt .Errorf ("binding LinesGPU program: %w" , err )
158- }
140+ prog := lines .prog
141+ prog .Bind ()
159142 defer prog .Unbind ()
160143 var p runtime.Pinner
161144 ssbo := loadSSBO (lines .Displacements , 2 , gl .STATIC_DRAW )
162- err = glgl .Err ()
163- if err != nil {
164- return err
145+ if ssbo == 0 {
146+ return glErrOrMessage ("loading displacements SSBO got zero id" )
165147 }
166148 p .Pin (& ssbo )
167149 defer p .Unpin ()
@@ -200,17 +182,13 @@ func copySSBO[T any](dst []T, ssbo uint32) error {
200182 gl .BindBuffer (gl .SHADER_STORAGE_BUFFER , ssbo )
201183 ptr := gl .MapBufferRange (gl .SHADER_STORAGE_BUFFER , 0 , bufSize , gl .MAP_READ_BIT )
202184 if ptr == nil {
203- err := glgl .Err ()
204- if err != nil {
205- return err
206- }
207- return errors .New ("failed to map buffer" )
185+ return glErrOrMessage ("failed to map SSBO buffer during copy" )
208186 }
209187 defer gl .UnmapBuffer (gl .SHADER_STORAGE_BUFFER )
210188 gpuBytes := unsafe .Slice ((* byte )(ptr ), bufSize )
211189 bufBytes := unsafe .Slice ((* byte )(unsafe .Pointer (& dst [0 ])), bufSize )
212190 copy (bufBytes , gpuBytes )
213- return glgl . Err ()
191+ return nil
214192}
215193
216194func computeEvaluate [T ms2.Vec | ms3.Vec ](pos []T , dist []float32 , invocX int , objects []glbuild.ShaderObject ) (err error ) {
@@ -240,17 +218,16 @@ func computeEvaluate[T ms2.Vec | ms3.Vec](pos []T, dist []float32, invocX int, o
240218 ssbo := & objects [i ]
241219 if ssbo .IsBindable () {
242220 id := ssbosIDs [iid ]
221+ if id == 0 {
222+ p .Unpin ()
223+ return glErrOrMessage ("zero id for SSBO set by GL during compute binding" )
224+ }
243225 iid ++
244226 gl .BindBuffer (gl .SHADER_STORAGE_BUFFER , id )
245227 gl .BufferData (gl .SHADER_STORAGE_BUFFER , ssbo .Size , ssbo .Data , gl .STATIC_DRAW )
246228 gl .BindBufferBase (gl .SHADER_STORAGE_BUFFER , uint32 (ssbo .Binding ), id )
247229 }
248230 }
249- err := glgl .Err ()
250- if err != nil {
251- p .Unpin ()
252- return fmt .Errorf ("binding SSBOs: %w" , err )
253- }
254231 }
255232
256233 var posSSBO , distSSBO uint32
@@ -259,32 +236,33 @@ func computeEvaluate[T ms2.Vec | ms3.Vec](pos []T, dist []float32, invocX int, o
259236 defer p .Unpin ()
260237
261238 posSSBO = loadSSBO (pos , 0 , gl .STATIC_DRAW )
262- err = glgl .Err ()
263- if err != nil {
264- return err
239+ if posSSBO == 0 {
240+ return glErrOrMessage ("zero SSBO id set by GL during compute loading" )
265241 }
242+
266243 defer gl .DeleteBuffers (1 , & posSSBO )
267244
268245 distSSBO = createSSBO (elemSize [float32 ]()* len (dist ), 1 , gl .DYNAMIC_READ )
269- err = glgl .Err ()
270- if err != nil {
271- return err
246+ if distSSBO == 0 {
247+ return glErrOrMessage ("zero id SSBO creating distance buffer" )
272248 }
273249 nWorkX := (len (dist ) + invocX - 1 ) / invocX
274250 defer gl .DeleteBuffers (1 , & distSSBO )
275251 gl .DispatchCompute (uint32 (nWorkX ), 1 , 1 )
276- err = glgl .Err ()
277- if err != nil {
278- return err
279- }
280252 gl .MemoryBarrier (gl .SHADER_STORAGE_BARRIER_BIT )
281- err = glgl .Err ()
282- if err != nil {
283- return err
284- }
285253 err = copySSBO (dist , distSSBO )
286254 if err != nil {
287255 return err
288256 }
289- return nil
257+ return glgl .Err ()
258+ }
259+
260+ func glErrOrMessage (defaultMsg string ) (err error ) {
261+ err = glgl .Err ()
262+ if err == nil {
263+ err = errors .New (defaultMsg )
264+ } else {
265+ err = fmt .Errorf ("%s: %w" , defaultMsg , err )
266+ }
267+ return err
290268}
0 commit comments