Archived
1
Fork 0

Add support for more GFX texture usages to WebGPU

This commit is contained in:
Joshua Goins 2022-03-06 19:38:17 -05:00
parent 45a33c55a2
commit 3e08319684

View file

@ -243,6 +243,21 @@ GFXTexture* GFXWebGPU::create_texture(const GFXTextureCreateInfo& info) {
descriptor.usage = WGPUTextureUsage_None; descriptor.usage = WGPUTextureUsage_None;
if((info.usage & GFXTextureUsage::Sampled) == GFXTextureUsage::Sampled)
descriptor.usage |= WGPUTextureUsage_TextureBinding;
if((info.usage & GFXTextureUsage::Sampled) == GFXTextureUsage::Attachment)
descriptor.usage |= WGPUTextureUsage_RenderAttachment;
if((info.usage & GFXTextureUsage::Sampled) == GFXTextureUsage::TransferDst)
descriptor.usage |= WGPUTextureUsage_CopyDst;
if((info.usage & GFXTextureUsage::Sampled) == GFXTextureUsage::TransferSrc)
descriptor.usage |= WGPUTextureUsage_CopySrc;
if((info.usage & GFXTextureUsage::Storage) == GFXTextureUsage::Storage)
descriptor.usage |= WGPUTextureUsage_StorageBinding;
texture->handle = wgpuDeviceCreateTexture(device, &descriptor); texture->handle = wgpuDeviceCreateTexture(device, &descriptor);
return texture; return texture;
@ -294,7 +309,7 @@ GFXPipeline* GFXWebGPU::create_graphics_pipeline(const GFXGraphicsPipelineCreate
descriptor.vertex.module = create_shader(vertex_shader_vector.data(), vertex_shader_vector.size() * sizeof(uint32_t), std::string(info.label + " vertex stage").c_str()); descriptor.vertex.module = create_shader(vertex_shader_vector.data(), vertex_shader_vector.size() * sizeof(uint32_t), std::string(info.label + " vertex stage").c_str());
} }
else { else {
auto vertex_shader = prism::open_file(prism::internal_domain / (info.shaders.vertex_src.as_path().string()), true); auto vertex_shader = prism::open_file(prism::internal_domain / (info.shaders.vertex_src.as_path().string() + ".wgsl.spv"), true);
vertex_shader->read_all(); vertex_shader->read_all();
descriptor.vertex.module = create_shader(vertex_shader->cast_data<uint32_t>(), vertex_shader->size(), info.shaders.vertex_src.as_path().string().c_str()); descriptor.vertex.module = create_shader(vertex_shader->cast_data<uint32_t>(), vertex_shader->size(), info.shaders.vertex_src.as_path().string().c_str());
@ -315,7 +330,7 @@ GFXPipeline* GFXWebGPU::create_graphics_pipeline(const GFXGraphicsPipelineCreate
fragment.module = create_shader(fragment_shader_vector.data(), fragment_shader_vector.size() * sizeof(uint32_t), std::string(info.label + " fragment stage").c_str()); fragment.module = create_shader(fragment_shader_vector.data(), fragment_shader_vector.size() * sizeof(uint32_t), std::string(info.label + " fragment stage").c_str());
} }
else { else {
auto fragment_shader = prism::open_file(prism::internal_domain / (info.shaders.fragment_src.as_path().string()), true); auto fragment_shader = prism::open_file(prism::internal_domain / (info.shaders.fragment_src.as_path().string() + ".wgsl.spv"), true);
fragment_shader->read_all(); fragment_shader->read_all();
fragment.module = create_shader(fragment_shader->cast_data<uint32_t>(), fragment_shader->size(), info.shaders.fragment_src.as_path().string().c_str()); fragment.module = create_shader(fragment_shader->cast_data<uint32_t>(), fragment_shader->size(), info.shaders.fragment_src.as_path().string().c_str());
@ -416,7 +431,7 @@ GFXPipeline* GFXWebGPU::create_compute_pipeline(const GFXComputePipelineCreateIn
descriptor.compute.module = create_shader(compute_shader_vector.data(), compute_shader_vector.size() * sizeof(uint32_t), info.label.c_str()); descriptor.compute.module = create_shader(compute_shader_vector.data(), compute_shader_vector.size() * sizeof(uint32_t), info.label.c_str());
} }
else { else {
auto compute_shader = prism::open_file(prism::internal_domain / (info.compute_src.as_path().string()), true); auto compute_shader = prism::open_file(prism::internal_domain / (info.compute_src.as_path().string() + ".wgsl.spv"), true);
compute_shader->read_all(); compute_shader->read_all();
descriptor.compute.module = create_shader(compute_shader->cast_data<uint32_t>(), compute_shader->size(), info.compute_src.as_path().string().c_str()); descriptor.compute.module = create_shader(compute_shader->cast_data<uint32_t>(), compute_shader->size(), info.compute_src.as_path().string().c_str());
@ -429,7 +444,7 @@ GFXPipeline* GFXWebGPU::create_compute_pipeline(const GFXComputePipelineCreateIn
} }
void GFXWebGPU::submit(GFXCommandBuffer* command_buffer, const platform::window_ptr window) { void GFXWebGPU::submit(GFXCommandBuffer* command_buffer, const platform::window_ptr window) {
WGPUTextureView backBufView = wgpuSwapChainGetCurrentTextureView(swapchain); // create textureView WGPUTextureView backBufView = wgpuSwapChainGetCurrentTextureView(swapchain);
WGPUCommandEncoder encoder = wgpuDeviceCreateCommandEncoder(device, nullptr); WGPUCommandEncoder encoder = wgpuDeviceCreateCommandEncoder(device, nullptr);
WGPUCommandBuffer commands = wgpuCommandEncoderFinish(encoder, nullptr); WGPUCommandBuffer commands = wgpuCommandEncoderFinish(encoder, nullptr);