Implement External Texture Binding Functionality

Adds functionality to BindGroupLayout and BindGroup to allow
GPUExternalTexture bindings.

Bug: dawn:728
Change-Id: I651b28606dceda15f0a944711ddba639df77c1a3
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/47381
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
Brandon Jones
2021-06-01 19:45:53 +00:00
committed by Dawn LUCI CQ
parent a9e39e11a8
commit 39633e2da2
32 changed files with 889 additions and 35 deletions

View File

@@ -26,7 +26,6 @@
#include <sstream>
namespace utils {
wgpu::ShaderModule CreateShaderModuleFromASM(const wgpu::Device& device, const char* source) {
// Use SPIRV-Tools's C API to assemble the SPIR-V assembly text to binary. Because the types
// aren't RAII, we don't return directly on success and instead always go through the code
@@ -296,6 +295,19 @@ namespace utils {
storageTexture.viewDimension = textureViewDimension;
}
// ExternalTextureBindingLayout never contains data, so just make one that can be reused instead
// of declaring a new one every time it's needed.
wgpu::ExternalTextureBindingLayout kExternalTextureBindingLayout = {};
BindingLayoutEntryInitializationHelper::BindingLayoutEntryInitializationHelper(
uint32_t entryBinding,
wgpu::ShaderStage entryVisibility,
wgpu::ExternalTextureBindingLayout* bindingLayout) {
binding = entryBinding;
visibility = entryVisibility;
nextInChain = bindingLayout;
}
BindingLayoutEntryInitializationHelper::BindingLayoutEntryInitializationHelper(
const wgpu::BindGroupLayoutEntry& entry)
: wgpu::BindGroupLayoutEntry(entry) {
@@ -311,6 +323,13 @@ namespace utils {
: binding(binding), textureView(textureView) {
}
BindingInitializationHelper::BindingInitializationHelper(
uint32_t binding,
const wgpu::ExternalTexture& externalTexture)
: binding(binding) {
externalTextureBindingEntry.externalTexture = externalTexture;
}
BindingInitializationHelper::BindingInitializationHelper(uint32_t binding,
const wgpu::Buffer& buffer,
uint64_t offset,
@@ -327,6 +346,9 @@ namespace utils {
result.buffer = buffer;
result.offset = offset;
result.size = size;
if (externalTextureBindingEntry.externalTexture != nullptr) {
result.nextInChain = &externalTextureBindingEntry;
}
return result;
}

View File

@@ -97,6 +97,8 @@ namespace utils {
wgpu::PipelineLayout MakePipelineLayout(const wgpu::Device& device,
std::vector<wgpu::BindGroupLayout> bgls);
extern wgpu::ExternalTextureBindingLayout kExternalTextureBindingLayout;
// Helpers to make creating bind group layouts look nicer:
//
// utils::MakeBindGroupLayout(device, {
@@ -126,6 +128,9 @@ namespace utils {
wgpu::StorageTextureAccess storageTextureAccess,
wgpu::TextureFormat format,
wgpu::TextureViewDimension viewDimension = wgpu::TextureViewDimension::e2D);
BindingLayoutEntryInitializationHelper(uint32_t entryBinding,
wgpu::ShaderStage entryVisibility,
wgpu::ExternalTextureBindingLayout* bindingLayout);
BindingLayoutEntryInitializationHelper(const wgpu::BindGroupLayoutEntry& entry);
};
@@ -147,6 +152,7 @@ namespace utils {
struct BindingInitializationHelper {
BindingInitializationHelper(uint32_t binding, const wgpu::Sampler& sampler);
BindingInitializationHelper(uint32_t binding, const wgpu::TextureView& textureView);
BindingInitializationHelper(uint32_t binding, const wgpu::ExternalTexture& externalTexture);
BindingInitializationHelper(uint32_t binding,
const wgpu::Buffer& buffer,
uint64_t offset = 0,
@@ -158,6 +164,7 @@ namespace utils {
wgpu::Sampler sampler;
wgpu::TextureView textureView;
wgpu::Buffer buffer;
wgpu::ExternalTextureBindingEntry externalTextureBindingEntry;
uint64_t offset = 0;
uint64_t size = 0;
};