Class: WGPU::Buffer
- Inherits:
-
Object
- Object
- WGPU::Buffer
- Includes:
- NativeResource
- Defined in:
- lib/wgpu/resources/buffer.rb,
sig/wgpu.rbs
Constant Summary
Constants included from NativeResource
NativeResource::GUARDED_METHOD_EXEMPTIONS
Instance Attribute Summary collapse
-
#handle ⇒ Object
readonly
Returns the value of attribute handle.
-
#size ⇒ Integer
readonly
Returns the value of attribute size.
-
#usage ⇒ Integer
readonly
Returns the value of attribute usage.
Attributes included from NativeResource
Instance Method Summary collapse
-
#destroy ⇒ void
Destroys the buffer's storage.
-
#get_mapped_range(offset: 0, size: nil) ⇒ BufferMappedRange
Returns a writable view of a mapped byte range.
-
#initialize(device, label: nil, size:, usage:, mapped_at_creation: false) ⇒ Buffer
constructor
Creates a GPU buffer with the requested size and usage.
-
#map_async(mode, offset: 0, size: nil) ⇒ AsyncTask
Maps a range on a background task.
-
#map_state ⇒ Symbol
Returns the current mapping state.
-
#map_sync(mode, offset: 0, size: nil, timeout: nil) ⇒ Boolean
Maps a range and waits for native completion.
-
#mapped_range(offset: 0, size: nil) ⇒ BufferMappedRange
Returns a writable view of a mapped byte range.
-
#read_mapped(offset: 0, size: nil, type: nil) ⇒ String, Array
Reads mapped bytes, optionally decoding typed values.
-
#read_mapped_data(offset: 0, size: nil) ⇒ String
Copies bytes from a const mapped range.
-
#read_mapped_float64s(offset: 0, count: nil) ⇒ Array<Float>
Reads mapped bytes as 64-bit floating-point values.
-
#read_mapped_floats(offset: 0, count: nil) ⇒ Array<Float>
Reads mapped bytes as 32-bit floating-point values.
-
#read_mapped_int32s(offset: 0, count: nil) ⇒ Array<Integer>
Reads mapped bytes as signed 32-bit integers.
-
#read_mapped_uint16s(offset: 0, count: nil) ⇒ Array<Integer>
Reads mapped bytes as unsigned 16-bit integers.
-
#read_mapped_uint32s(offset: 0, count: nil) ⇒ Array<Integer>
Reads mapped bytes as unsigned 32-bit integers.
-
#read_mapped_uint8s(offset: 0, count: nil) ⇒ Array<Integer>
Reads mapped bytes as unsigned 8-bit integers.
-
#read_mapped_values(type: :f32, offset: 0, count: nil) ⇒ Array
Reads mapped values of the requested element type.
-
#release ⇒ void
Releases the native buffer handle.
-
#unmap ⇒ void
Unmaps the buffer and invalidates its mapped ranges.
-
#write(data, offset: 0, type: :f32) ⇒ void
Writes typed data through the device's default queue.
-
#write_mapped(data, offset: 0, type: :f32) ⇒ void
Writes typed data into a mapped range.
Methods included from NativeResource
included, #inspect, #released?, #use
Constructor Details
#initialize(device, label: nil, size:, usage:, mapped_at_creation: false) ⇒ Buffer
Creates a GPU buffer with the requested size and usage.
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/wgpu/resources/buffer.rb', line 13 def initialize(device, label: nil, size:, usage:, mapped_at_creation: false) @device = device @size = size @usage = begin normalize_usage(usage) rescue ArgumentError => e raise ArgumentError, (e., label) end @mapped = mapped_at_creation @map_state = mapped_at_creation ? :mapped : :unmapped @map_generation = 0 @map_state_mutex = Mutex.new desc, keepalive = build_descriptor( label:, size:, usage: @usage, mapped_at_creation: ) @descriptor_keepalive = keepalive device.push_error_scope(:validation) @handle = Native.wgpuDeviceCreateBuffer(device.handle, desc) error = device.pop_error_scope @descriptor_keepalive = nil if @handle.null? || (error[:type] && error[:type] != :no_error) msg = error[:message] || "Failed to create buffer" raise BufferError, (msg, label) end end |
Instance Attribute Details
#handle ⇒ Object (readonly)
Returns the value of attribute handle.
5 6 7 |
# File 'lib/wgpu/resources/buffer.rb', line 5 def handle @handle end |
#size ⇒ Integer (readonly)
Returns the value of attribute size.
5 6 7 |
# File 'lib/wgpu/resources/buffer.rb', line 5 def size @size end |
#usage ⇒ Integer (readonly)
Returns the value of attribute usage.
5 6 7 |
# File 'lib/wgpu/resources/buffer.rb', line 5 def usage @usage end |
Instance Method Details
#destroy ⇒ void
This method returns an undefined value.
Destroys the buffer's storage.
230 231 232 233 |
# File 'lib/wgpu/resources/buffer.rb', line 230 def destroy Native.wgpuBufferDestroy(@handle) invalidate_map_state end |
#get_mapped_range(offset: 0, size: nil) ⇒ BufferMappedRange
Returns a writable view of a mapped byte range.
74 75 76 |
# File 'lib/wgpu/resources/buffer.rb', line 74 def get_mapped_range(offset: 0, size: nil) mapped_range(offset: offset, size: size) end |
#map_async(mode, offset: 0, size: nil) ⇒ AsyncTask
Maps a range on a background task.
104 105 106 107 108 109 110 111 |
# File 'lib/wgpu/resources/buffer.rb', line 104 def map_async(mode, offset: 0, size: nil) status_holder, _callback_token, future, generation = begin_map_request(mode, offset: offset, size: size) AsyncTask.new do wait_for_map(status_holder, future) finalize_map(status_holder, generation) end end |
#map_state ⇒ Symbol
Returns the current mapping state.
222 223 224 225 226 |
# File 'lib/wgpu/resources/buffer.rb', line 222 def map_state return map_state_mutex.synchronize { @map_state } unless Native.buffer_map_state_available? Native.wgpuBufferGetMapState(@handle) || map_state_mutex.synchronize { @map_state } end |
#map_sync(mode, offset: 0, size: nil, timeout: nil) ⇒ Boolean
Maps a range and waits for native completion.
94 95 96 97 98 99 |
# File 'lib/wgpu/resources/buffer.rb', line 94 def map_sync(mode, offset: 0, size: nil, timeout: nil) status_holder, _callback_token, future, generation = begin_map_request(mode, offset: offset, size: size) wait_for_map(status_holder, future, timeout:) finalize_map(status_holder, generation) end |
#mapped_range(offset: 0, size: nil) ⇒ BufferMappedRange
Returns a writable view of a mapped byte range.
61 62 63 64 65 66 67 68 69 70 |
# File 'lib/wgpu/resources/buffer.rb', line 61 def mapped_range(offset: 0, size: nil) raise BufferError, "Buffer is not mapped" unless @mapped size ||= @size - offset offset, size = validate_map_range!(offset, size) ptr = Native.wgpuBufferGetMappedRange(@handle, offset, size) raise BufferError, "Failed to get mapped range" if ptr.null? BufferMappedRange.new(ptr, size) end |
#read_mapped(offset: 0, size: nil, type: nil) ⇒ String, Array
Reads mapped bytes, optionally decoding typed values.
130 131 132 133 |
# File 'lib/wgpu/resources/buffer.rb', line 130 def read_mapped(offset: 0, size: nil, type: nil) bytes = read_mapped_data(offset: offset, size: size) type ? DataTypes.unpack(bytes, type:) : bytes end |
#read_mapped_data(offset: 0, size: nil) ⇒ String
Copies bytes from a const mapped range.
116 117 118 119 120 121 122 123 124 125 |
# File 'lib/wgpu/resources/buffer.rb', line 116 def read_mapped_data(offset: 0, size: nil) raise BufferError, "Buffer is not mapped" unless @mapped size ||= @size - offset offset, size = validate_map_range!(offset, size) ptr = Native.wgpuBufferGetConstMappedRange(@handle, offset, size) raise BufferError, "Failed to get mapped range" if ptr.null? ptr.read_bytes(size) end |
#read_mapped_float64s(offset: 0, count: nil) ⇒ Array<Float>
Reads mapped bytes as 64-bit floating-point values.
186 187 188 |
# File 'lib/wgpu/resources/buffer.rb', line 186 def read_mapped_float64s(offset: 0, count: nil) read_mapped_values(type: :f64, offset:, count:) end |
#read_mapped_floats(offset: 0, count: nil) ⇒ Array<Float>
Reads mapped bytes as 32-bit floating-point values.
156 157 158 |
# File 'lib/wgpu/resources/buffer.rb', line 156 def read_mapped_floats(offset: 0, count: nil) read_mapped_values(type: :f32, offset:, count:) end |
#read_mapped_int32s(offset: 0, count: nil) ⇒ Array<Integer>
Reads mapped bytes as signed 32-bit integers.
176 177 178 |
# File 'lib/wgpu/resources/buffer.rb', line 176 def read_mapped_int32s(offset: 0, count: nil) read_mapped_values(type: :i32, offset:, count:) end |
#read_mapped_uint16s(offset: 0, count: nil) ⇒ Array<Integer>
Reads mapped bytes as unsigned 16-bit integers.
196 197 198 |
# File 'lib/wgpu/resources/buffer.rb', line 196 def read_mapped_uint16s(offset: 0, count: nil) read_mapped_values(type: :u16, offset:, count:) end |
#read_mapped_uint32s(offset: 0, count: nil) ⇒ Array<Integer>
Reads mapped bytes as unsigned 32-bit integers.
166 167 168 |
# File 'lib/wgpu/resources/buffer.rb', line 166 def read_mapped_uint32s(offset: 0, count: nil) read_mapped_values(type: :u32, offset:, count:) end |
#read_mapped_uint8s(offset: 0, count: nil) ⇒ Array<Integer>
Reads mapped bytes as unsigned 8-bit integers.
206 207 208 |
# File 'lib/wgpu/resources/buffer.rb', line 206 def read_mapped_uint8s(offset: 0, count: nil) read_mapped_values(type: :u8, offset:, count:) end |
#read_mapped_values(type: :f32, offset: 0, count: nil) ⇒ Array
Reads mapped values of the requested element type.
214 215 216 217 218 |
# File 'lib/wgpu/resources/buffer.rb', line 214 def read_mapped_values(type: :f32, offset: 0, count: nil) element_size = DataTypes.byte_size(type) size = count ? count * element_size : @size - offset DataTypes.unpack(read_mapped_data(offset:, size:), type:) end |
#release ⇒ void
This method returns an undefined value.
Releases the native buffer handle.
Calling this method more than once has no effect.
239 240 241 242 243 244 |
# File 'lib/wgpu/resources/buffer.rb', line 239 def release return if @handle.null? Native.wgpuBufferRelease(@handle) @handle = FFI::Pointer::NULL invalidate_map_state end |
#unmap ⇒ void
This method returns an undefined value.
Unmaps the buffer and invalidates its mapped ranges.
80 81 82 83 84 85 86 87 |
# File 'lib/wgpu/resources/buffer.rb', line 80 def unmap Native.wgpuBufferUnmap(@handle) map_state_mutex.synchronize do @map_generation = current_map_generation + 1 @mapped = false @map_state = :unmapped end end |
#write(data, offset: 0, type: :f32) ⇒ void
This method returns an undefined value.
Writes typed data through the device's default queue.
51 52 53 54 55 56 |
# File 'lib/wgpu/resources/buffer.rb', line 51 def write(data, offset: 0, type: :f32) ptr, byte_size = DataTypes.to_pointer(data, type:) DataTypes.validate_alignment!(offset, 4, name: "offset") DataTypes.validate_alignment!(byte_size, 4, name: "data size") Native.wgpuQueueWriteBuffer(@device.queue.handle, @handle, offset, ptr, byte_size) end |
#write_mapped(data, offset: 0, type: :f32) ⇒ void
This method returns an undefined value.
Writes typed data into a mapped range.
139 140 141 142 143 144 145 146 147 148 |
# File 'lib/wgpu/resources/buffer.rb', line 139 def write_mapped(data, offset: 0, type: :f32) raise BufferError, "Buffer is not mapped" unless @mapped ptr, byte_size = DataTypes.to_pointer(data, type:) offset, byte_size = validate_map_range!(offset, byte_size) target = Native.wgpuBufferGetMappedRange(@handle, offset, byte_size) raise BufferError, "Failed to get mapped range" if target.null? target.put_bytes(0, ptr.read_bytes(byte_size)) end |