buffer.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. //go:build !js
  2. package wgpu
  3. /*
  4. #include <stdlib.h>
  5. #include "./lib/wgpu.h"
  6. extern void gowebgpu_error_callback_c(WGPUErrorType type, char const * message, void * userdata);
  7. extern void gowebgpu_buffer_map_callback_c(WGPUBufferMapAsyncStatus status, void *userdata);
  8. static inline void gowebgpu_buffer_map_async(WGPUBuffer buffer, WGPUMapModeFlags mode, size_t offset, size_t size, WGPUBufferMapAsyncCallback callback, void * userdata, WGPUDevice device, void * error_userdata) {
  9. wgpuDevicePushErrorScope(device, WGPUErrorFilter_Validation);
  10. wgpuBufferMapAsync(buffer, mode, offset, size, callback, userdata);
  11. wgpuDevicePopErrorScope(device, gowebgpu_error_callback_c, error_userdata);
  12. }
  13. static inline void gowebgpu_buffer_unmap(WGPUBuffer buffer, WGPUDevice device, void * error_userdata) {
  14. wgpuDevicePushErrorScope(device, WGPUErrorFilter_Validation);
  15. wgpuBufferUnmap(buffer);
  16. wgpuDevicePopErrorScope(device, gowebgpu_error_callback_c, error_userdata);
  17. }
  18. static inline void gowebgpu_buffer_release(WGPUBuffer buffer, WGPUDevice device) {
  19. wgpuDeviceRelease(device);
  20. wgpuBufferRelease(buffer);
  21. }
  22. */
  23. import "C"
  24. import (
  25. "errors"
  26. "runtime/cgo"
  27. "unsafe"
  28. )
  29. type Buffer struct {
  30. deviceRef C.WGPUDevice
  31. ref C.WGPUBuffer
  32. }
  33. func (p *Buffer) Destroy() {
  34. C.wgpuBufferDestroy(p.ref)
  35. }
  36. func (p *Buffer) GetMappedRange(offset, size uint) []byte {
  37. buf := C.wgpuBufferGetMappedRange(p.ref, C.size_t(offset), C.size_t(size))
  38. return unsafe.Slice((*byte)(buf), size)
  39. }
  40. func (p *Buffer) GetSize() uint64 {
  41. return uint64(C.wgpuBufferGetSize(p.ref))
  42. }
  43. func (p *Buffer) GetUsage() BufferUsage {
  44. return BufferUsage(C.wgpuBufferGetUsage(p.ref))
  45. }
  46. //export gowebgpu_buffer_map_callback_go
  47. func gowebgpu_buffer_map_callback_go(status C.WGPUBufferMapAsyncStatus, userdata unsafe.Pointer) {
  48. handle := *(*cgo.Handle)(userdata)
  49. defer handle.Delete()
  50. cb, ok := handle.Value().(BufferMapCallback)
  51. if ok {
  52. cb(BufferMapAsyncStatus(status))
  53. }
  54. }
  55. func (p *Buffer) MapAsync(mode MapMode, offset uint64, size uint64, callback BufferMapCallback) (err error) {
  56. callbackHandle := cgo.NewHandle(callback)
  57. var cb errorCallback = func(_ ErrorType, message string) {
  58. err = errors.New("wgpu.(*Buffer).MapAsync(): " + message)
  59. }
  60. errorCallbackHandle := cgo.NewHandle(cb)
  61. defer errorCallbackHandle.Delete()
  62. C.gowebgpu_buffer_map_async(
  63. p.ref,
  64. C.WGPUMapModeFlags(mode),
  65. C.size_t(offset),
  66. C.size_t(size),
  67. (C.WGPUBufferMapAsyncCallback)(C.gowebgpu_buffer_map_callback_c),
  68. unsafe.Pointer(&callbackHandle),
  69. p.deviceRef,
  70. unsafe.Pointer(&errorCallbackHandle),
  71. )
  72. return
  73. }
  74. func (p *Buffer) Unmap() (err error) {
  75. var cb errorCallback = func(_ ErrorType, message string) {
  76. err = errors.New("wgpu.(*Buffer).Unmap(): " + message)
  77. }
  78. errorCallbackHandle := cgo.NewHandle(cb)
  79. defer errorCallbackHandle.Delete()
  80. C.gowebgpu_buffer_unmap(
  81. p.ref,
  82. p.deviceRef,
  83. unsafe.Pointer(&errorCallbackHandle),
  84. )
  85. return
  86. }
  87. func (p *Buffer) Release() {
  88. C.gowebgpu_buffer_release(p.ref, p.deviceRef)
  89. }