Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def upload_to_texture(device, texture, data, nx, ny, nz):
nbytes = ctypes.sizeof(data)
bpp = nbytes // (nx * ny * nz)
# Create a buffer to get the data into the GPU
buffer = device.create_buffer_with_data(data=data, usage=wgpu.BufferUsage.COPY_SRC)
# Copy to texture (rows_per_image must only be nonzero for 3D textures)
command_encoder = device.create_command_encoder()
command_encoder.copy_buffer_to_texture(
{"buffer": buffer, "offset": 0, "bytes_per_row": bpp * nx, "rows_per_image": 0},
{"texture": texture, "mip_level": 0, "origin": (0, 0, 0)},
(nx, ny, nz),
)
device.default_queue.submit([command_encoder.finish()])
@python2shader
def fragment_shader(out_color: (RES_OUTPUT, 0, vec4),):
out_color = vec4(1.0, 0.499, 0.0, 1.0) # noqa
# Bindings and layout
bind_group_layout = device.create_bind_group_layout(entries=[]) # zero bindings
bind_group = device.create_bind_group(layout=bind_group_layout, entries=[])
pipeline_layout = device.create_pipeline_layout(
bind_group_layouts=[bind_group_layout]
)
# Index buffer
indices = (ctypes.c_int32 * 6)(0, 1, 2, 2, 1, 3)
ibo = device.create_buffer_with_data(
data=indices, usage=wgpu.BufferUsage.INDEX | wgpu.BufferUsage.MAP_WRITE,
)
# Render
render_args = device, vertex_shader, fragment_shader, pipeline_layout, bind_group
# render_to_screen(*render_args, topology=wgpu.PrimitiveTopology.triangle_list, ibo=ibo)
a = render_to_texture(
*render_args,
size=(64, 64),
topology=wgpu.PrimitiveTopology.triangle_list,
ibo=ibo,
)
# Check that the background is all zero
bg = a.copy()
bg[16:-16, 16:-16, :] = 0
assert np.all(bg == 0)
# Create a device and compile the shader
device = wgpu.utils.get_default_device()
cshader = device.create_shader_module(code=shader)
# Create buffers for input and output arrays
buffers = {}
for index, array in input_arrays.items():
usage = wgpu.BufferUsage.STORAGE | wgpu.BufferUsage.MAP_WRITE
if index in output_arrays:
usage |= wgpu.BufferUsage.MAP_READ
buffer = device.create_buffer_with_data(data=array, usage=usage)
buffers[index] = buffer
for index, info in output_infos.items():
if index in input_arrays:
continue # We already have this buffer
usage = wgpu.BufferUsage.STORAGE | wgpu.BufferUsage.MAP_READ
buffers[index] = device.create_buffer(size=info["nbytes"], usage=usage)
# Create bindings and binding layouts
bindings = []
binding_layouts = []
for index, buffer in buffers.items():
bindings.append(
{
"binding": index,
"resource": {"buffer": buffer, "offset": 0, "size": buffer.size},
}
)
binding_layouts.append(
{
"binding": index,
"visibility": wgpu.ShaderStage.COMPUTE,
[200, 50, 100, 150],
],
dtype=np.uint8,
)
texture_size = texture_data.shape[1], texture_data.shape[0], 1
uniform_type = Struct(transform=mat4)
uniform_data = np.asarray(shadertype_as_ctype(uniform_type)())
# %% Create resource objects (buffers, textures, samplers)
# Create vertex buffer, and upload data
vertex_buffer = device.create_buffer_with_data(
data=vertex_data, usage=wgpu.BufferUsage.VERTEX
)
# Create index buffer, and upload data
index_buffer = device.create_buffer_with_data(
data=index_data, usage=wgpu.BufferUsage.INDEX
)
# Create uniform buffer - data is uploaded each frame
uniform_buffer = device.create_buffer(
size=uniform_data.nbytes, usage=wgpu.BufferUsage.UNIFORM | wgpu.BufferUsage.COPY_DST
)
# Create texture, and upload data
texture = device.create_texture(
size=texture_size,
uniform_type = Struct(transform=mat4)
uniform_data = np.asarray(shadertype_as_ctype(uniform_type)())
# %% Create resource objects (buffers, textures, samplers)
# Create vertex buffer, and upload data
vertex_buffer = device.create_buffer_with_data(
data=vertex_data, usage=wgpu.BufferUsage.VERTEX
)
# Create index buffer, and upload data
index_buffer = device.create_buffer_with_data(
data=index_data, usage=wgpu.BufferUsage.INDEX
)
# Create uniform buffer - data is uploaded each frame
uniform_buffer = device.create_buffer(
size=uniform_data.nbytes, usage=wgpu.BufferUsage.UNIFORM | wgpu.BufferUsage.COPY_DST
)
# Create texture, and upload data
texture = device.create_texture(
size=texture_size,
usage=wgpu.TextureUsage.COPY_DST | wgpu.TextureUsage.SAMPLED,
dimension=wgpu.TextureDimension.d2,
format=wgpu.TextureFormat.r8uint,
mip_level_count=1,
sample_count=1,