@flighthq/render-gl 0.5.1-next.1069.554a2ac → 0.5.1-next.1201.9b49dee

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +2 -2
  2. package/dist/contract.d.ts +1 -3
  3. package/dist/contract.d.ts.map +1 -1
  4. package/dist/contract.js +1 -3
  5. package/dist/contract.js.map +1 -1
  6. package/dist/enableGlRenderStateGuards.js +2 -2
  7. package/dist/enableGlRenderStateGuards.js.map +1 -1
  8. package/dist/glCubeRenderTarget.d.ts +5 -5
  9. package/dist/glCubeRenderTarget.d.ts.map +1 -1
  10. package/dist/glCubeRenderTarget.js +16 -13
  11. package/dist/glCubeRenderTarget.js.map +1 -1
  12. package/dist/glFullscreenPass.d.ts +4 -3
  13. package/dist/glFullscreenPass.d.ts.map +1 -1
  14. package/dist/glFullscreenPass.js +152 -23
  15. package/dist/glFullscreenPass.js.map +1 -1
  16. package/dist/glLinearToSrgbPass.d.ts +2 -2
  17. package/dist/glLinearToSrgbPass.d.ts.map +1 -1
  18. package/dist/glLinearToSrgbPass.js.map +1 -1
  19. package/dist/glPresentRenderTarget.d.ts +2 -2
  20. package/dist/glPresentRenderTarget.d.ts.map +1 -1
  21. package/dist/glPresentRenderTarget.js.map +1 -1
  22. package/dist/glReadback.d.ts +2 -2
  23. package/dist/glReadback.d.ts.map +1 -1
  24. package/dist/glReadback.js +1 -1
  25. package/dist/glReadback.js.map +1 -1
  26. package/dist/glRenderPass.d.ts +6 -3
  27. package/dist/glRenderPass.d.ts.map +1 -1
  28. package/dist/glRenderPass.js +105 -86
  29. package/dist/glRenderPass.js.map +1 -1
  30. package/dist/glRenderState.d.ts +1 -2
  31. package/dist/glRenderState.d.ts.map +1 -1
  32. package/dist/glRenderState.js +53 -46
  33. package/dist/glRenderState.js.map +1 -1
  34. package/dist/glRenderTarget.d.ts +17 -16
  35. package/dist/glRenderTarget.d.ts.map +1 -1
  36. package/dist/glRenderTarget.js +38 -26
  37. package/dist/glRenderTarget.js.map +1 -1
  38. package/dist/glRenderTargetPool.d.ts +9 -9
  39. package/dist/glRenderTargetPool.d.ts.map +1 -1
  40. package/dist/glRenderTargetPool.js +10 -12
  41. package/dist/glRenderTargetPool.js.map +1 -1
  42. package/dist/glRenderTexture.d.ts +2 -2
  43. package/dist/glRenderTexture.d.ts.map +1 -1
  44. package/dist/glRenderTexture.js +11 -13
  45. package/dist/glRenderTexture.js.map +1 -1
  46. package/dist/glRenderTexturePool.js +3 -5
  47. package/dist/glRenderTexturePool.js.map +1 -1
  48. package/dist/glSkinPaletteTexture.js +8 -2
  49. package/dist/glSkinPaletteTexture.js.map +1 -1
  50. package/dist/glTestHelper.d.ts +0 -1
  51. package/dist/glTestHelper.d.ts.map +1 -1
  52. package/dist/glTestHelper.js +0 -1
  53. package/dist/glTestHelper.js.map +1 -1
  54. package/dist/index.d.ts +1 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +1 -1
  57. package/dist/index.js.map +1 -1
  58. package/package.json +11 -11
  59. package/src/enableGlRenderStateGuards.test.ts +2 -4
  60. package/src/glContext.test.ts +3 -52
  61. package/src/glCubeRenderTarget.test.ts +10 -8
  62. package/src/glDraw.test.ts +4 -16
  63. package/src/glFullscreenPass.test.ts +145 -41
  64. package/src/glLinearToSrgbPass.test.ts +8 -5
  65. package/src/glPresentRenderTarget.test.ts +3 -5
  66. package/src/glReadback.test.ts +3 -3
  67. package/src/glRenderPass.test.ts +228 -55
  68. package/src/glRenderState.test.ts +106 -165
  69. package/src/glRenderTarget.test.ts +134 -99
  70. package/src/glRenderTargetPool.test.ts +69 -76
  71. package/src/glRenderTexture.test.ts +58 -31
  72. package/src/glSkinPaletteTexture.test.ts +9 -0
  73. package/src/glTextureResolver.test.ts +5 -1
  74. package/dist/glBackground.d.ts +0 -3
  75. package/dist/glBackground.d.ts.map +0 -1
  76. package/dist/glBackground.js +0 -19
  77. package/dist/glBackground.js.map +0 -1
  78. package/dist/glContext.d.ts +0 -3
  79. package/dist/glContext.d.ts.map +0 -1
  80. package/dist/glContext.js +0 -16
  81. package/dist/glContext.js.map +0 -1
  82. package/src/glBackground.test.ts +0 -68
@@ -1 +1 @@
1
- {"version":3,"file":"glTestHelper.js","sourceRoot":"","sources":["../src/glTestHelper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"glTestHelper.js","sourceRoot":"","sources":["../src/glTestHelper.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { acquireGlRenderTexture, applyGlBlendMode, beginGlCubeRenderFace, beginGlRenderPass, bindGlImageResourceTexture, bindGlRenderTexture, bindGlTexture, clearGlRenderTexture, createGlCanvasElement, createGlRenderSurface, createExternalGlTexture, createGlOffscreenRenderState, createGlContextFromCanvasElement, createEmptyGlRegistries, createGlContextState, createGlCubeRenderTarget, createGlPipeline, createGlRenderState, createGlRenderTexturePool, createGlRenderTarget, destroyGlCubeRenderTarget, destroyGlRenderTarget, destroyGlRenderTexture, destroyGlRenderTexturePool, destroyGlRenderState, disposeExternalGlTexture, drawGlFullscreenPass, drawGlQuad, enableGlRenderTextureGuards, enableGlRenderStateGuards, enableGlTextureResolverGuards, enableGlBlendModeSupport, endGlRenderPass, endGlCubeRenderFace, explainGlRenderSurfaceAbsence, explainGlRenderTarget, explainGlRenderTexture, explainGlTextureResolution, getGlPipelineRegistries, isGlRenderTargetFormatSupported, popGlRenderState, registerGlBitmapTextureResolver, registerGlCompressedTextureDecoder, registerGlCompressedImageTextureResolver, registerGlCompressedTextureUpload, registerGlImageTextureResolver, registerGlRenderTextureResolver, registerStandardGlTextureResolvers, registerGlTextureResolver, presentGlRenderTarget, pushGlRenderState, renderGlBackground, renderIntoGlRenderTexture, releaseGlRenderTexture, resolveGlTexture, setGlRenderTransform2D, standardGlBlendRealizations, standardGlTextureResolvers, uploadGlCompressedTextureContainer, withGlRenderState, withGlRenderTextures, } from './contract';
1
+ export { acquireGlRenderTexture, applyGlBlendMode, beginGlCubeRenderFace, beginGlRenderPass, bindGlImageResourceTexture, bindGlRenderTexture, bindGlTexture, clearGlRenderTarget, clearGlRenderTargetAttachments, clearGlRenderTexture, createGlCanvasElement, createGlRenderSurface, createExternalGlTexture, createEmptyGlRegistries, createGlCubeRenderTarget, createGlPipeline, createGlRenderState, createGlRenderTexturePool, createGlScreenRenderTarget, createGlTextureRenderTarget, destroyGlCubeRenderTarget, destroyGlTextureRenderTarget, destroyGlRenderTexture, destroyGlRenderTexturePool, destroyGlRenderState, disposeExternalGlTexture, drawGlFullscreenPass, drawGlQuad, fillGlRect, enableGlRenderTextureGuards, enableGlRenderStateGuards, enableGlTextureResolverGuards, enableGlBlendModeSupport, endGlRenderPass, endGlCubeRenderFace, explainGlRenderSurfaceAbsence, explainGlTextureRenderTarget, explainGlRenderTexture, explainGlTextureResolution, getGlCurrentRenderPass, getGlPipelineRegistries, isGlRenderTargetFormatSupported, popGlRenderState, registerGlBitmapTextureResolver, registerGlCompressedTextureDecoder, registerGlCompressedImageTextureResolver, registerGlCompressedTextureUpload, registerGlImageTextureResolver, registerGlRenderTextureResolver, registerStandardGlTextureResolvers, registerGlTextureResolver, presentGlRenderTarget, pushGlRenderState, renderIntoGlRenderTexture, releaseGlRenderTexture, resolveGlTexture, setGlRenderTransform2D, standardGlBlendRealizations, standardGlTextureResolvers, uploadGlCompressedTextureContainer, withGlRenderState, withGlRenderTextures, } from './contract';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,0BAA0B,EAC1B,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,4BAA4B,EAC5B,gCAAgC,EAChC,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,UAAU,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,+BAA+B,EAC/B,gBAAgB,EAChB,+BAA+B,EAC/B,kCAAkC,EAClC,wCAAwC,EACxC,iCAAiC,EACjC,8BAA8B,EAC9B,+BAA+B,EAC/B,kCAAkC,EAClC,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,kCAAkC,EAClC,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,0BAA0B,EAC1B,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,8BAA8B,EAC9B,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,0BAA0B,EAC1B,2BAA2B,EAC3B,yBAAyB,EACzB,4BAA4B,EAC5B,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,UAAU,EACV,UAAU,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,4BAA4B,EAC5B,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,+BAA+B,EAC/B,gBAAgB,EAChB,+BAA+B,EAC/B,kCAAkC,EAClC,wCAAwC,EACxC,iCAAiC,EACjC,8BAA8B,EAC9B,+BAA+B,EAC/B,kCAAkC,EAClC,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,kCAAkC,EAClC,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { acquireGlRenderTexture, applyGlBlendMode, beginGlCubeRenderFace, beginGlRenderPass, bindGlImageResourceTexture, bindGlRenderTexture, bindGlTexture, clearGlRenderTexture, createGlCanvasElement, createGlRenderSurface, createExternalGlTexture, createGlOffscreenRenderState, createGlContextFromCanvasElement, createEmptyGlRegistries, createGlContextState, createGlCubeRenderTarget, createGlPipeline, createGlRenderState, createGlRenderTexturePool, createGlRenderTarget, destroyGlCubeRenderTarget, destroyGlRenderTarget, destroyGlRenderTexture, destroyGlRenderTexturePool, destroyGlRenderState, disposeExternalGlTexture, drawGlFullscreenPass, drawGlQuad, enableGlRenderTextureGuards, enableGlRenderStateGuards, enableGlTextureResolverGuards, enableGlBlendModeSupport, endGlRenderPass, endGlCubeRenderFace, explainGlRenderSurfaceAbsence, explainGlRenderTarget, explainGlRenderTexture, explainGlTextureResolution, getGlPipelineRegistries, isGlRenderTargetFormatSupported, popGlRenderState, registerGlBitmapTextureResolver, registerGlCompressedTextureDecoder, registerGlCompressedImageTextureResolver, registerGlCompressedTextureUpload, registerGlImageTextureResolver, registerGlRenderTextureResolver, registerStandardGlTextureResolvers, registerGlTextureResolver, presentGlRenderTarget, pushGlRenderState, renderGlBackground, renderIntoGlRenderTexture, releaseGlRenderTexture, resolveGlTexture, setGlRenderTransform2D, standardGlBlendRealizations, standardGlTextureResolvers, uploadGlCompressedTextureContainer, withGlRenderState, withGlRenderTextures, } from './contract';
1
+ export { acquireGlRenderTexture, applyGlBlendMode, beginGlCubeRenderFace, beginGlRenderPass, bindGlImageResourceTexture, bindGlRenderTexture, bindGlTexture, clearGlRenderTarget, clearGlRenderTargetAttachments, clearGlRenderTexture, createGlCanvasElement, createGlRenderSurface, createExternalGlTexture, createEmptyGlRegistries, createGlCubeRenderTarget, createGlPipeline, createGlRenderState, createGlRenderTexturePool, createGlScreenRenderTarget, createGlTextureRenderTarget, destroyGlCubeRenderTarget, destroyGlTextureRenderTarget, destroyGlRenderTexture, destroyGlRenderTexturePool, destroyGlRenderState, disposeExternalGlTexture, drawGlFullscreenPass, drawGlQuad, fillGlRect, enableGlRenderTextureGuards, enableGlRenderStateGuards, enableGlTextureResolverGuards, enableGlBlendModeSupport, endGlRenderPass, endGlCubeRenderFace, explainGlRenderSurfaceAbsence, explainGlTextureRenderTarget, explainGlRenderTexture, explainGlTextureResolution, getGlCurrentRenderPass, getGlPipelineRegistries, isGlRenderTargetFormatSupported, popGlRenderState, registerGlBitmapTextureResolver, registerGlCompressedTextureDecoder, registerGlCompressedImageTextureResolver, registerGlCompressedTextureUpload, registerGlImageTextureResolver, registerGlRenderTextureResolver, registerStandardGlTextureResolvers, registerGlTextureResolver, presentGlRenderTarget, pushGlRenderState, renderIntoGlRenderTexture, releaseGlRenderTexture, resolveGlTexture, setGlRenderTransform2D, standardGlBlendRealizations, standardGlTextureResolvers, uploadGlCompressedTextureContainer, withGlRenderState, withGlRenderTextures, } from './contract';
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,0BAA0B,EAC1B,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,4BAA4B,EAC5B,gCAAgC,EAChC,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,UAAU,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,+BAA+B,EAC/B,gBAAgB,EAChB,+BAA+B,EAC/B,kCAAkC,EAClC,wCAAwC,EACxC,iCAAiC,EACjC,8BAA8B,EAC9B,+BAA+B,EAC/B,kCAAkC,EAClC,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,kCAAkC,EAClC,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,0BAA0B,EAC1B,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,8BAA8B,EAC9B,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,0BAA0B,EAC1B,2BAA2B,EAC3B,yBAAyB,EACzB,4BAA4B,EAC5B,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,UAAU,EACV,UAAU,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,4BAA4B,EAC5B,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,+BAA+B,EAC/B,gBAAgB,EAChB,+BAA+B,EAC/B,kCAAkC,EAClC,wCAAwC,EACxC,iCAAiC,EACjC,8BAA8B,EAC9B,+BAA+B,EAC/B,kCAAkC,EAClC,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,kCAAkC,EAClC,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/render-gl",
3
- "version": "0.5.1-next.1069.554a2ac",
3
+ "version": "0.5.1-next.1201.9b49dee",
4
4
  "author": "Joshua Granick and other contributors",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,16 +38,16 @@
38
38
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
39
39
  },
40
40
  "dependencies": {
41
- "@flighthq/color": "0.5.1-next.1069.554a2ac",
42
- "@flighthq/entity": "0.5.1-next.1069.554a2ac",
43
- "@flighthq/log": "0.5.1-next.1069.554a2ac",
44
- "@flighthq/scene2d": "0.5.1-next.1069.554a2ac",
45
- "@flighthq/geometry": "0.5.1-next.1069.554a2ac",
46
- "@flighthq/render": "0.5.1-next.1069.554a2ac",
47
- "@flighthq/registry": "0.5.1-next.1069.554a2ac",
48
- "@flighthq/signals": "0.5.1-next.1069.554a2ac",
49
- "@flighthq/texture": "0.5.1-next.1069.554a2ac",
50
- "@flighthq/types": "0.5.1-next.1069.554a2ac"
41
+ "@flighthq/color": "0.5.1-next.1201.9b49dee",
42
+ "@flighthq/entity": "0.5.1-next.1201.9b49dee",
43
+ "@flighthq/log": "0.5.1-next.1201.9b49dee",
44
+ "@flighthq/scene2d": "0.5.1-next.1201.9b49dee",
45
+ "@flighthq/geometry": "0.5.1-next.1201.9b49dee",
46
+ "@flighthq/render": "0.5.1-next.1201.9b49dee",
47
+ "@flighthq/registry": "0.5.1-next.1201.9b49dee",
48
+ "@flighthq/signals": "0.5.1-next.1201.9b49dee",
49
+ "@flighthq/texture": "0.5.1-next.1201.9b49dee",
50
+ "@flighthq/types": "0.5.1-next.1201.9b49dee"
51
51
  },
52
52
  "devDependencies": {
53
53
  "typescript": "^5.3.0"
@@ -4,17 +4,15 @@ import type { LogEntry } from '@flighthq/types/contract';
4
4
  import { RegistryEntryState } from '@flighthq/types/contract';
5
5
 
6
6
  import { areGlRenderStateGuardsEnabled, enableGlRenderStateGuards } from './enableGlRenderStateGuards';
7
- import { createGlContextFromCanvasElement } from './glContext';
8
7
  import { useGlProgram } from './glDraw';
9
8
  import { createEmptyGlRegistries, createGlPipeline } from './glPipeline';
10
- import { createGlContextState, createGlRenderState, getGlRenderStateRuntime } from './glRenderState';
9
+ import { createGlRenderState, getGlRenderStateRuntime } from './glRenderState';
11
10
  import { makeGL } from './glTestHelper';
12
11
 
13
12
  function createState() {
14
13
  const canvas = document.createElement('canvas');
15
14
  canvas.getContext = vi.fn().mockReturnValue(makeGL()) as typeof canvas.getContext;
16
- const contextState = createGlContextState(createGlContextFromCanvasElement(canvas));
17
- return createGlRenderState(contextState, createGlPipeline(createEmptyGlRegistries()));
15
+ return createGlRenderState(makeGL(), createGlPipeline(createEmptyGlRegistries()));
18
16
  }
19
17
 
20
18
  beforeEach(() => clearLogOnceKeys());
@@ -1,63 +1,14 @@
1
1
  import { build } from 'esbuild';
2
2
 
3
- import { createGlContextFromCanvasElement } from './glContext';
4
- import { makeGL } from './glTestHelper';
5
-
6
- function makeCanvas(context: WebGL2RenderingContext | null = makeGL()): HTMLCanvasElement {
7
- const canvas = document.createElement('canvas');
8
- canvas.getContext = vi.fn().mockReturnValue(context) as typeof canvas.getContext;
9
- return canvas;
10
- }
11
-
12
- describe('createGlContextFromCanvasElement', () => {
13
- it('returns the canvas WebGL2 context', () => {
14
- const gl = makeGL();
15
- expect(createGlContextFromCanvasElement(makeCanvas(gl))).toBe(gl);
16
- });
17
-
18
- it('requests the context defaults independently from render options', () => {
19
- const canvas = makeCanvas();
20
- createGlContextFromCanvasElement(canvas);
21
- expect(canvas.getContext).toHaveBeenCalledWith('webgl2', {
22
- alpha: true,
23
- antialias: true,
24
- powerPreference: 'default',
25
- stencil: true,
26
- });
27
- });
28
-
29
- it('applies context options and lets explicit attributes override their convenience fields', () => {
30
- const canvas = makeCanvas();
31
- createGlContextFromCanvasElement(canvas, {
32
- antialias: false,
33
- contextAttributes: { alpha: false, antialias: true, preserveDrawingBuffer: true },
34
- powerPreference: 'high-performance',
35
- });
36
- expect(canvas.getContext).toHaveBeenCalledWith('webgl2', {
37
- alpha: false,
38
- antialias: true,
39
- powerPreference: 'high-performance',
40
- preserveDrawingBuffer: true,
41
- stencil: true,
42
- });
43
- });
44
-
45
- it('throws when the canvas has no WebGL2 context', () => {
46
- expect(() => createGlContextFromCanvasElement(makeCanvas(null))).toThrow('Failed to get WebGL2 context.');
47
- });
48
-
3
+ describe('createGlRenderState tree-shaking', () => {
49
4
  it('tree-shakes canvas context acquisition out of a context-first state bundle', async () => {
50
5
  const renderStateBundle = await bundleRenderGlExport('createGlRenderState');
51
6
  expect(renderStateBundle).not.toContain('Failed to get WebGL2 context.');
52
7
  expect(renderStateBundle).not.toMatch(/\.getContext\(["']webgl2["']/);
53
-
54
- const contextBundle = await bundleRenderGlExport('createGlContextFromCanvasElement');
55
- expect(contextBundle).toContain('Failed to get WebGL2 context.');
56
- expect(contextBundle).toMatch(/\.getContext\(["']webgl2["']/);
57
8
  });
58
9
  });
59
10
 
60
- async function bundleRenderGlExport(name: 'createGlContextFromCanvasElement' | 'createGlRenderState'): Promise<string> {
11
+ async function bundleRenderGlExport(name: 'createGlRenderState'): Promise<string> {
61
12
  const result = await build({
62
13
  bundle: true,
63
14
  format: 'esm',
@@ -79,5 +30,5 @@ function getFileUrlDirectory(url: string): string {
79
30
  const directory = new URL('.', url);
80
31
  const pathname = decodeURIComponent(directory.pathname);
81
32
  if (directory.hostname !== '') return `//${directory.hostname}${pathname}`;
82
- return /^\/[A-Za-z]:\//.test(pathname) ? pathname.slice(1) : pathname;
33
+ return /^\/[A-Za-z0-9]:\//.test(pathname) ? pathname.slice(1) : pathname;
83
34
  }
@@ -1,3 +1,4 @@
1
+ import type { GlRenderPass, GlRenderTarget } from '@flighthq/types/contract';
1
2
  import { EntityRuntimeKey } from '@flighthq/types/contract';
2
3
 
3
4
  import {
@@ -12,7 +13,7 @@ import { declareGlRenderTargetColorSpace } from './glRenderTarget';
12
13
  import { createGlState } from './glTestHelper';
13
14
 
14
15
  function makeState() {
15
- const { state, gl: base } = createGlState({ backgroundColorRgba: [0.25, 0.5, 0.75, 1] });
16
+ const { state, gl: base } = createGlState();
16
17
  const framebuffer = { name: 'cube-framebuffer' } as WebGLFramebuffer;
17
18
  const texture = { name: 'cube-texture' } as WebGLTexture;
18
19
  const renderbuffer = { name: 'cube-depth' } as WebGLRenderbuffer;
@@ -96,7 +97,7 @@ describe('beginGlCubeRenderFace', () => {
96
97
  const target = createGlCubeRenderTarget(state, 32);
97
98
  vi.clearAllMocks();
98
99
 
99
- beginGlCubeRenderFace(state, target, 4);
100
+ const pass = beginGlCubeRenderFace(state, target, 4);
100
101
  expect(declareGlRenderTargetColorSpace(state, 'srgb')).toBe(true);
101
102
 
102
103
  expect(gl.bindFramebuffer).toHaveBeenCalledWith(gl.FRAMEBUFFER, framebuffer);
@@ -108,10 +109,10 @@ describe('beginGlCubeRenderFace', () => {
108
109
  0,
109
110
  );
110
111
  expect(gl.viewport).toHaveBeenCalledWith(0, 0, 32, 32);
111
- expect(gl.clearBufferfv).toHaveBeenCalledWith(gl.COLOR, 0, new Float32Array([0.25, 0.5, 0.75, 1]));
112
+ expect(gl.clearBufferfv).toHaveBeenCalledWith(gl.COLOR, 0, new Float32Array([0, 0, 0, 0]));
112
113
  expect(gl.clearBufferfi).toHaveBeenCalledWith(gl.DEPTH_STENCIL, 0, 1, 0);
113
114
  expect(target.colorSpace).toBe('srgb');
114
- endGlCubeRenderFace(state);
115
+ endGlCubeRenderFace(pass);
115
116
  });
116
117
 
117
118
  it('rejects a face outside the six-face cube range', () => {
@@ -170,7 +171,7 @@ describe('destroyGlCubeRenderTarget', () => {
170
171
  const target = createGlCubeRenderTarget(state, 16);
171
172
  vi.clearAllMocks();
172
173
 
173
- destroyGlCubeRenderTarget(state, target);
174
+ destroyGlCubeRenderTarget(target);
174
175
 
175
176
  expect(gl.deleteFramebuffer).toHaveBeenCalledWith(framebuffer);
176
177
  expect(gl.deleteTexture).toHaveBeenCalledWith(texture);
@@ -187,9 +188,9 @@ describe('endGlCubeRenderFace', () => {
187
188
  runtime.renderTargetViewport = { height: 60, width: 50, x: 3, y: 4 };
188
189
  vi.clearAllMocks();
189
190
 
190
- beginGlCubeRenderFace(state, target, 0);
191
+ const pass = beginGlCubeRenderFace(state, target, 0);
191
192
  expect(runtime.currentRenderTarget).toBe(target);
192
- endGlCubeRenderFace(state);
193
+ endGlCubeRenderFace(pass);
193
194
 
194
195
  expect(vi.mocked(gl.bindFramebuffer).mock.lastCall).toEqual([gl.FRAMEBUFFER, previousFramebuffer]);
195
196
  expect(vi.mocked(gl.viewport).mock.lastCall).toEqual([3, 4, 50, 60]);
@@ -201,7 +202,8 @@ describe('endGlCubeRenderFace', () => {
201
202
 
202
203
  it('rejects an unmatched end', () => {
203
204
  const { state } = makeState();
204
- expect(() => endGlCubeRenderFace(state)).toThrow('without a matching beginGlCubeRenderFace');
205
+ const mockPass = { gl: state.gl, state, target: {} as GlRenderTarget } as GlRenderPass;
206
+ expect(() => endGlCubeRenderFace(mockPass)).toThrow('without a matching beginGlCubeRenderFace');
205
207
  });
206
208
  });
207
209
 
@@ -32,20 +32,14 @@ import {
32
32
  useGlProgram,
33
33
  } from './glDraw';
34
34
  import { createEmptyGlRegistries, createGlPipeline } from './glPipeline';
35
- import {
36
- createGlContextState,
37
- createGlOffscreenRenderState,
38
- createGlRenderState,
39
- getGlRenderStateRuntime,
40
- invalidateGlRenderStateCache,
41
- } from './glRenderState';
35
+ import { createGlRenderState, getGlRenderStateRuntime, invalidateGlRenderStateCache } from './glRenderState';
42
36
  import { registerGlBitmapShader } from './glShaderRegistry';
43
37
  import { createGlState, makeGL } from './glTestHelper';
44
38
 
45
39
  const testPipeline = createGlPipeline(createEmptyGlRegistries());
46
40
 
47
41
  function createTestGlRenderState(gl: WebGL2RenderingContext) {
48
- return createGlRenderState(createGlContextState(gl), testPipeline);
42
+ return createGlRenderState(gl, testPipeline);
49
43
  }
50
44
 
51
45
  // A single 4×4 bc3 level for exercising the opt-in compressed upload seam.
@@ -104,10 +98,7 @@ describe('applyGlBlendMode', () => {
104
98
  const gl = makeGL();
105
99
  const screen = createTestGlRenderState(gl);
106
100
  registerGlBlendMode(screen, 'acme.Split', { dst: 'ONE', equation: 'MIN', src: 'ONE' });
107
- const offscreen = createGlOffscreenRenderState(
108
- screen.contextState,
109
- createGlPipeline(getGlRenderStateRuntime(screen).registries),
110
- );
101
+ const offscreen = createGlRenderState(screen.gl, createGlPipeline(getGlRenderStateRuntime(screen).registries));
111
102
  registerGlBlendMode(screen, 'acme.Split', { dst: 'ONE', src: 'ZERO' });
112
103
 
113
104
  applyGlBlendMode(offscreen, 'acme.Split');
@@ -922,10 +913,7 @@ describe('registerGlBlendMode', () => {
922
913
  const replacement = { src: 'ZERO', dst: 'ONE' } as const;
923
914
  registerGlBlendMode(screen, 'acme.Foo', initial);
924
915
  const snapshot = getGlRenderStateRuntime(screen).registries.blendRealizations;
925
- const offscreen = createGlOffscreenRenderState(
926
- screen.contextState,
927
- createGlPipeline(getGlRenderStateRuntime(screen).registries),
928
- );
916
+ const offscreen = createGlRenderState(screen.gl, createGlPipeline(getGlRenderStateRuntime(screen).registries));
929
917
 
930
918
  registerGlBlendMode(screen, 'acme.Foo', replacement);
931
919
 
@@ -1,10 +1,24 @@
1
1
  import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
- import type { GlRenderTarget } from '@flighthq/types/contract';
3
-
4
- import { clearGlRenderTarget, compileGlFullscreenProgram, drawGlFullscreenPass } from './glFullscreenPass';
2
+ import type { GlRenderPass, GlRenderState, GlTextureRenderTarget } from '@flighthq/types/contract';
3
+
4
+ import {
5
+ clearGlRenderTarget,
6
+ clearGlRenderTargetAttachments,
7
+ compileGlFullscreenProgram,
8
+ drawGlFullscreenPass,
9
+ fillGlRect,
10
+ } from './glFullscreenPass';
5
11
  import { getGlRenderStateRuntime } from './glRenderState';
6
12
  import { createGlState, makeGL } from './glTestHelper';
7
13
 
14
+ function makePass(state: GlRenderState): GlRenderPass {
15
+ const pass = allocateEntity<GlRenderPass>();
16
+ (pass as unknown as { gl: GlRenderState['gl'] }).gl = state.gl;
17
+ (pass as unknown as { state: GlRenderState }).state = state;
18
+ (pass as unknown as { target: null }).target = null as never;
19
+ return finishEntity(pass);
20
+ }
21
+
8
22
  const FRAG_SRC = `#version 300 es
9
23
  precision mediump float;
10
24
  in vec2 v_texCoord;
@@ -14,8 +28,14 @@ void main() {
14
28
  fragColor = texture(u_texture, v_texCoord);
15
29
  }`;
16
30
 
17
- function makeTarget(framebuffer: WebGLFramebuffer, width = 32, height = 16): GlRenderTarget {
18
- const out = allocateEntity<GlRenderTarget>();
31
+ function makeTarget(
32
+ framebuffer: WebGLFramebuffer,
33
+ width = 32,
34
+ height = 16,
35
+ gl?: WebGL2RenderingContext,
36
+ ): GlTextureRenderTarget {
37
+ const out = allocateEntity<GlTextureRenderTarget>();
38
+ if (gl) (out as unknown as { gl: WebGL2RenderingContext }).gl = gl;
19
39
  out.requestedAxes = {
20
40
  width,
21
41
  height,
@@ -33,13 +53,12 @@ function makeTarget(framebuffer: WebGLFramebuffer, width = 32, height = 16): GlR
33
53
  out.colorFormats = ['rgba8'];
34
54
  out.depth = 'none';
35
55
  out.colorSpace = 'srgb';
36
- out.clearColors = [];
37
- out.clearDepth = 1;
38
56
  out.sampleCount = 1;
39
57
  out.framebuffer = framebuffer;
40
58
  out.resolveFramebuffer = null;
41
- out.textures = [];
42
- out.texture = {} as WebGLTexture;
59
+ const texture = {} as WebGLTexture;
60
+ out.textures = [texture];
61
+ out.texture = texture;
43
62
  out.depthTexture = null;
44
63
  out.colorRenderbuffers = [];
45
64
  out.depthStencilRenderbuffer = null;
@@ -47,61 +66,85 @@ function makeTarget(framebuffer: WebGLFramebuffer, width = 32, height = 16): GlR
47
66
  }
48
67
 
49
68
  describe('clearGlRenderTarget', () => {
50
- it('binds the target framebuffer and clears it', () => {
51
- const { state, gl } = createGlState();
69
+ it('binds the target framebuffer and clears color via clearBufferfv', () => {
70
+ const { gl } = createGlState();
52
71
  const fb = {} as WebGLFramebuffer;
53
- const target = makeTarget(fb);
72
+ const target = makeTarget(fb, 32, 16, gl);
54
73
  const bindSpy = vi.spyOn(gl, 'bindFramebuffer');
55
- const clearSpy = vi.spyOn(gl, 'clear');
74
+ const clearSpy = vi.spyOn(gl, 'clearBufferfv');
56
75
 
57
- clearGlRenderTarget(state, target);
76
+ clearGlRenderTarget(target, { color: [0, 0, 0, 0] });
58
77
 
59
78
  expect(bindSpy).toHaveBeenCalledWith(gl.FRAMEBUFFER, fb);
60
- expect(clearSpy).toHaveBeenCalledWith(gl.COLOR_BUFFER_BIT);
79
+ expect(clearSpy).toHaveBeenCalledWith(gl.COLOR, 0, expect.anything());
61
80
  });
62
81
 
63
- it('sets the viewport and renderTargetViewport to the target size', () => {
64
- const { state, gl } = createGlState();
65
- const target = makeTarget({} as WebGLFramebuffer, 48, 24);
82
+ it('sets the viewport to the target size', () => {
83
+ const { gl } = createGlState();
84
+ const target = makeTarget({} as WebGLFramebuffer, 48, 24, gl);
66
85
  const viewportSpy = vi.spyOn(gl, 'viewport');
67
86
 
68
- clearGlRenderTarget(state, target);
87
+ clearGlRenderTarget(target, { color: [0, 0, 0, 0] });
69
88
 
70
89
  expect(viewportSpy).toHaveBeenCalledWith(0, 0, 48, 24);
71
- expect(getGlRenderStateRuntime(state).renderTargetViewport).toEqual({ height: 24, width: 48, x: 0, y: 0 });
72
90
  });
73
91
 
74
- it('clears to fully transparent', () => {
75
- const { state, gl } = createGlState();
76
- const clearColorSpy = vi.spyOn(gl, 'clearColor');
92
+ it('writes float RGBA values directly to clearBufferfv', () => {
93
+ const { gl } = createGlState();
94
+ const clearSpy = vi.spyOn(gl, 'clearBufferfv');
95
+
96
+ clearGlRenderTarget(makeTarget({} as WebGLFramebuffer, 32, 16, gl), { color: [1, 0, 0.5, 1] });
77
97
 
78
- clearGlRenderTarget(state, makeTarget({} as WebGLFramebuffer));
98
+ const rgba = clearSpy.mock.calls[0][2] as Float32Array;
99
+ expect(rgba[0]).toBeCloseTo(1);
100
+ expect(rgba[1]).toBeCloseTo(0);
101
+ expect(rgba[2]).toBeCloseTo(0.5);
102
+ expect(rgba[3]).toBeCloseTo(1);
103
+ });
104
+ });
79
105
 
80
- expect(clearColorSpy).toHaveBeenCalledWith(0, 0, 0, 0);
106
+ describe('clearGlRenderTargetAttachments', () => {
107
+ it('clears individual color attachments via clearBufferfv', () => {
108
+ const { gl } = createGlState();
109
+ const fb = {} as WebGLFramebuffer;
110
+ const target = makeTarget(fb, 32, 16, gl);
111
+ const clearSpy = vi.spyOn(gl, 'clearBufferfv');
112
+
113
+ clearGlRenderTargetAttachments(target, {
114
+ colors: [
115
+ [1, 0, 0, 1],
116
+ [0, 1, 0, 1],
117
+ ],
118
+ });
119
+
120
+ expect(clearSpy).toHaveBeenCalledWith(gl.COLOR, 0, expect.anything());
121
+ expect(clearSpy).toHaveBeenCalledWith(gl.COLOR, 1, expect.anything());
81
122
  });
82
123
 
83
- it('invalidates cached texture and blend-mode bindings', () => {
84
- const { state } = createGlState();
85
- const runtime = getGlRenderStateRuntime(state);
86
- runtime.context.currentTextureRealization = { straightAlpha: false, texture: {} as WebGLTexture };
87
- runtime.context.currentBlendSignature = { dst: 0, equation: 0, src: 0 };
124
+ it('skips undefined entries in colors', () => {
125
+ const { gl } = createGlState();
126
+ const target = makeTarget({} as WebGLFramebuffer, 32, 16, gl);
127
+ const clearSpy = vi.spyOn(gl, 'clearBufferfv');
88
128
 
89
- clearGlRenderTarget(state, makeTarget({} as WebGLFramebuffer));
129
+ clearGlRenderTargetAttachments(target, {
130
+ colors: [undefined, [0, 0, 1, 1]],
131
+ });
90
132
 
91
- expect(runtime.context.currentTextureRealization).toBeNull();
92
- expect(runtime.context.currentBlendSignature).toBeNull();
133
+ expect(clearSpy).toHaveBeenCalledTimes(1);
134
+ expect(clearSpy).toHaveBeenCalledWith(gl.COLOR, 1, expect.anything());
93
135
  });
94
136
 
95
- it('skips rebinding when the target framebuffer is already current', () => {
96
- const { state, gl } = createGlState();
97
- const fb = {} as WebGLFramebuffer;
98
- const runtime = getGlRenderStateRuntime(state);
99
- runtime.currentFramebuffer = fb;
100
- const bindSpy = vi.spyOn(gl, 'bindFramebuffer');
137
+ it('disables scissor test during clear and restores it', () => {
138
+ const { gl } = createGlState();
139
+ const target = makeTarget({} as WebGLFramebuffer, 32, 16, gl);
140
+ gl.enable(gl.SCISSOR_TEST);
141
+ const disableSpy = vi.spyOn(gl, 'disable');
142
+ const enableSpy = vi.spyOn(gl, 'enable');
101
143
 
102
- clearGlRenderTarget(state, makeTarget(fb));
144
+ clearGlRenderTargetAttachments(target, { colors: [[0, 0, 0, 0]] });
103
145
 
104
- expect(bindSpy).not.toHaveBeenCalled();
146
+ expect(disableSpy).toHaveBeenCalledWith(gl.SCISSOR_TEST);
147
+ expect(enableSpy).toHaveBeenCalledWith(gl.SCISSOR_TEST);
105
148
  });
106
149
  });
107
150
 
@@ -354,3 +397,64 @@ describe('drawGlFullscreenPass', () => {
354
397
  });
355
398
  });
356
399
  });
400
+
401
+ describe('fillGlRect', () => {
402
+ it('unpacks a packed RGBA integer into float uniform values', () => {
403
+ const { state, gl } = createGlState();
404
+ const uniform4fSpy = vi.spyOn(gl, 'uniform4f');
405
+
406
+ fillGlRect(makePass(state), 0xff8040ff);
407
+
408
+ const call = uniform4fSpy.mock.calls.find((c) => typeof c[1] === 'number' && c[1] === 1);
409
+ expect(call).toBeDefined();
410
+ expect(call![2]).toBeCloseTo(0x80 / 255);
411
+ expect(call![3]).toBeCloseTo(0x40 / 255);
412
+ expect(call![4]).toBeCloseTo(1);
413
+ });
414
+
415
+ it('draws with blending enabled and depth test off', () => {
416
+ const { state, gl } = createGlState();
417
+ gl.enable(gl.DEPTH_TEST);
418
+ gl.disable(gl.BLEND);
419
+ let blendAtDraw: boolean | null = null;
420
+ let depthAtDraw: boolean | null = null;
421
+ vi.spyOn(gl, 'drawElements').mockImplementation(() => {
422
+ blendAtDraw = gl.isEnabled(gl.BLEND);
423
+ depthAtDraw = gl.isEnabled(gl.DEPTH_TEST);
424
+ });
425
+
426
+ fillGlRect(makePass(state), 0x000000ff);
427
+
428
+ expect(blendAtDraw).toBe(true);
429
+ expect(depthAtDraw).toBe(false);
430
+ });
431
+
432
+ it('restores depth and blend state after drawing', () => {
433
+ const { state, gl } = createGlState();
434
+ gl.enable(gl.DEPTH_TEST);
435
+ gl.disable(gl.BLEND);
436
+
437
+ fillGlRect(makePass(state), 0x000000ff);
438
+
439
+ expect(gl.isEnabled(gl.DEPTH_TEST)).toBe(true);
440
+ expect(gl.isEnabled(gl.BLEND)).toBe(false);
441
+ });
442
+
443
+ it('enables scissor test when rect is provided', () => {
444
+ const { state, gl } = createGlState();
445
+ const scissorSpy = vi.spyOn(gl, 'scissor');
446
+
447
+ fillGlRect(makePass(state), 0xff0000ff, { x: 10, y: 20, width: 30, height: 40 });
448
+
449
+ expect(scissorSpy).toHaveBeenCalledWith(10, 20, 30, 40);
450
+ });
451
+
452
+ it('restores scissor state when rect is provided and scissor was off', () => {
453
+ const { state, gl } = createGlState();
454
+ gl.disable(gl.SCISSOR_TEST);
455
+
456
+ fillGlRect(makePass(state), 0xff0000ff, { x: 0, y: 0, width: 10, height: 10 });
457
+
458
+ expect(gl.isEnabled(gl.SCISSOR_TEST)).toBe(false);
459
+ });
460
+ });
@@ -1,11 +1,16 @@
1
1
  import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
- import type { GlRenderTarget } from '@flighthq/types/contract';
2
+ import type { GlTextureRenderTarget } from '@flighthq/types/contract';
3
3
 
4
4
  import { drawGlLinearToSrgbPass, LINEAR_TO_SRGB_FRAGMENT_SRC } from './glLinearToSrgbPass';
5
5
  import { createGlState } from './glTestHelper';
6
6
 
7
- function makeTarget(framebuffer: WebGLFramebuffer, texture: WebGLTexture, width = 32, height = 16): GlRenderTarget {
8
- const out = allocateEntity<GlRenderTarget>();
7
+ function makeTarget(
8
+ framebuffer: WebGLFramebuffer,
9
+ texture: WebGLTexture,
10
+ width = 32,
11
+ height = 16,
12
+ ): GlTextureRenderTarget {
13
+ const out = allocateEntity<GlTextureRenderTarget>();
9
14
  out.requestedAxes = {
10
15
  width,
11
16
  height,
@@ -23,8 +28,6 @@ function makeTarget(framebuffer: WebGLFramebuffer, texture: WebGLTexture, width
23
28
  out.colorFormats = ['rgba16f'];
24
29
  out.depth = 'none';
25
30
  out.colorSpace = 'linear';
26
- out.clearColors = [];
27
- out.clearDepth = 1;
28
31
  out.sampleCount = 1;
29
32
  out.framebuffer = framebuffer;
30
33
  out.resolveFramebuffer = null;
@@ -1,12 +1,12 @@
1
1
  import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
- import type { GlRenderTarget } from '@flighthq/types/contract';
2
+ import type { GlTextureRenderTarget } from '@flighthq/types/contract';
3
3
 
4
4
  import { presentGlRenderTarget } from './glPresentRenderTarget';
5
5
  import { createGlState } from './glTestHelper';
6
6
 
7
- function makeTarget(colorSpace: 'linear' | 'srgb', texture: WebGLTexture): GlRenderTarget {
7
+ function makeTarget(colorSpace: 'linear' | 'srgb', texture: WebGLTexture): GlTextureRenderTarget {
8
8
  const format = colorSpace === 'linear' ? 'rgba16f' : 'rgba8';
9
- const out = allocateEntity<GlRenderTarget>();
9
+ const out = allocateEntity<GlTextureRenderTarget>();
10
10
  out.requestedAxes = {
11
11
  width: 32,
12
12
  height: 16,
@@ -24,8 +24,6 @@ function makeTarget(colorSpace: 'linear' | 'srgb', texture: WebGLTexture): GlRen
24
24
  out.colorFormats = [format];
25
25
  out.depth = 'none';
26
26
  out.colorSpace = colorSpace;
27
- out.clearColors = [];
28
- out.clearDepth = 1;
29
27
  out.sampleCount = 1;
30
28
  out.framebuffer = {} as WebGLFramebuffer;
31
29
  out.resolveFramebuffer = null;
@@ -1,9 +1,9 @@
1
- import type { GlRenderTarget } from '@flighthq/types/contract';
1
+ import type { GlTextureRenderTarget } from '@flighthq/types/contract';
2
2
 
3
3
  import { readGlRenderTargetPixels } from './glReadback';
4
4
  import { createGlState } from './glTestHelper';
5
5
 
6
- function makeTarget(overrides?: Partial<GlRenderTarget>): GlRenderTarget {
6
+ function makeTarget(overrides?: Partial<GlTextureRenderTarget>): GlTextureRenderTarget {
7
7
  return {
8
8
  requestedAxes: {
9
9
  width: 4,
@@ -31,7 +31,7 @@ function makeTarget(overrides?: Partial<GlRenderTarget>): GlRenderTarget {
31
31
  colorRenderbuffers: [],
32
32
  depthStencilRenderbuffer: null,
33
33
  ...overrides,
34
- } as GlRenderTarget;
34
+ } as GlTextureRenderTarget;
35
35
  }
36
36
 
37
37
  describe('readGlRenderTargetPixels', () => {