webgpu.h introduce a base struct for extension structures.

struct WGPUChainedStruct {
     WGPUChainedStruct const * nextInChain;
     WGPUSType sType;
 };

And changes all the nextInChain to point to such structures. This adds
more type safety to extension structs and requires less casting to check
sTypes and friends.

Bug: dawn:269

Change-Id: I443f363cdb55dbec7c7f6e897245d4a7ea0ebe70
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/15080
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
This commit is contained in:
Corentin Wallez 2020-01-15 09:54:42 +00:00 committed by Commit Bot service account
parent 7f078e7ebe
commit 2b24c3d92d
11 changed files with 77 additions and 10 deletions

View File

@ -1298,6 +1298,12 @@
{"name": "implementation", "type": "uint64_t"}
]
},
"s type": {
"category": "enum",
"values": [
{"value": 0, "name": "invalid"}
]
},
"texture": {
"category": "object",
"methods": [

View File

@ -140,7 +140,11 @@ class StructureType(Record, Type):
def __init__(self, name, json_data):
Record.__init__(self, name)
Type.__init__(self, name, json_data)
self.chained = json_data.get("chained", False)
self.extensible = json_data.get("extensible", False)
# Chained structs inherit from wgpu::ChainedStruct which has nextInChain so setting
# both extensible and chained would result in two nextInChain members.
assert(not (self.extensible and self.chained))
class Command(Record):
def __init__(self, name, members=None):

View File

@ -16,6 +16,15 @@
namespace dawn_native {
static_assert(sizeof(ChainedStruct) == sizeof(WGPUChainedStruct),
"sizeof mismatch for ChainedStruct");
static_assert(alignof(ChainedStruct) == alignof(WGPUChainedStruct),
"alignof mismatch for ChainedStruct");
static_assert(offsetof(ChainedStruct, nextInChain) == offsetof(WGPUChainedStruct, nextInChain),
"offsetof mismatch for ChainedStruct::nextInChain");
static_assert(offsetof(ChainedStruct, sType) == offsetof(WGPUChainedStruct, sType),
"offsetof mismatch for ChainedStruct::sType");
{% for type in by_category["structure"] %}
{% set CppType = as_cppType(type.name) %}
{% set CType = as_cType(type.name) %}

View File

@ -32,13 +32,25 @@ namespace dawn_native {
{%- endif -%}
{%- endmacro %}
struct ChainedStruct {
ChainedStruct const * nextInChain = nullptr;
wgpu::SType sType = wgpu::SType::Invalid;
};
{% for type in by_category["structure"] %}
struct {{as_cppType(type.name)}} {
{% if type.chained %}
struct {{as_cppType(type.name)}} : ChainedStruct {
{{as_cppType(type.name)}}() {
sType = wgpu::SType::{{type.name.CamelCase()}};
}
{% else %}
struct {{as_cppType(type.name)}} {
{% endif %}
{% if type.extensible %}
const void* nextInChain = nullptr;
ChainedStruct const * nextInChain = nullptr;
{% endif %}
{% for member in type.members %}
{{as_annotated_frontendType(member)}} {{render_cpp_default_value(member)}};
{{as_annotated_frontendType(member)}} {{render_cpp_default_value(member)}};
{% endfor %}
};

View File

@ -73,10 +73,19 @@ typedef uint32_t WGPUFlags;
{% endfor %}
typedef struct WGPUChainedStruct {
struct WGPUChainedStruct const * nextInChain;
WGPUSType sType;
} WGPUChainedStruct;
{% for type in by_category["structure"] %}
typedef struct {{as_cType(type.name)}} {
{% if type.extensible %}
void const * nextInChain;
WGPUChainedStruct const * nextInChain;
{% endif %}
{% if type.chained %}
WGPUChainedStruct const * nextInChain;
WGPUSType sType;
{% endif %}
{% for member in type.members %}
{{as_annotated_cType(member)}};

View File

@ -42,6 +42,15 @@ namespace wgpu {
{% endfor %}
static_assert(sizeof(ChainedStruct) == sizeof(WGPUChainedStruct),
"sizeof mismatch for ChainedStruct");
static_assert(alignof(ChainedStruct) == alignof(WGPUChainedStruct),
"alignof mismatch for ChainedStruct");
static_assert(offsetof(ChainedStruct, nextInChain) == offsetof(WGPUChainedStruct, nextInChain),
"offsetof mismatch for ChainedStruct::nextInChain");
static_assert(offsetof(ChainedStruct, sType) == offsetof(WGPUChainedStruct, sType),
"offsetof mismatch for ChainedStruct::sType");
{% for type in by_category["structure"] %}
{% set CppType = as_cppType(type.name) %}
{% set CType = as_cType(type.name) %}

View File

@ -186,10 +186,22 @@ namespace wgpu {
Instance CreateInstance(InstanceDescriptor const * descriptor = nullptr);
Proc GetProcAddress(Device const& device, const char* procName);
struct ChainedStruct {
ChainedStruct const * nextInChain = nullptr;
SType sType = SType::Invalid;
};
{% for type in by_category["structure"] %}
struct {{as_cppType(type.name)}} {
{% if type.chained %}
struct {{as_cppType(type.name)}} : ChainedStruct {
{{as_cppType(type.name)}}() {
sType = SType::{{type.name.CamelCase()}};
}
{% else %}
struct {{as_cppType(type.name)}} {
{% endif %}
{% if type.extensible %}
const void* nextInChain = nullptr;
ChainedStruct const * nextInChain = nullptr;
{% endif %}
{% for member in type.members %}
{{as_annotated_cppType(member)}}{{render_cpp_default_value(member)}};

View File

@ -144,7 +144,9 @@ TEST_P(D3D12SharedHandleValidation, Success) {
// Test an error occurs if the texture descriptor is invalid
TEST_P(D3D12SharedHandleValidation, InvalidTextureDescriptor) {
DAWN_SKIP_TEST_IF(UsesWire());
dawnDescriptor.nextInChain = this;
wgpu::ChainedStruct chainedDescriptor;
dawnDescriptor.nextInChain = &chainedDescriptor;
wgpu::Texture texture;
ComPtr<ID3D11Texture2D> d3d11Texture;

View File

@ -136,7 +136,9 @@ TEST_P(IOSurfaceValidationTests, Success) {
// Test an error occurs if the texture descriptor is invalid
TEST_P(IOSurfaceValidationTests, InvalidTextureDescriptor) {
DAWN_SKIP_TEST_IF(UsesWire());
descriptor.nextInChain = this;
wgpu::ChainedStruct chainedDescriptor;
descriptor.nextInChain = &chainedDescriptor;
ASSERT_DEVICE_ERROR(wgpu::Texture texture =
WrapIOSurface(&descriptor, defaultIOSurface.get(), 0));

View File

@ -75,7 +75,8 @@ TEST_F(BindGroupValidationTest, NextInChainNullptr) {
device.CreateBindGroup(&descriptor);
// Check that nextInChain != nullptr is an error.
descriptor.nextInChain = static_cast<void*>(&descriptor);
wgpu::ChainedStruct chainedDescriptor;
descriptor.nextInChain = &chainedDescriptor;
ASSERT_DEVICE_ERROR(device.CreateBindGroup(&descriptor));
}

View File

@ -256,7 +256,8 @@ TEST_P(VulkanImageWrappingValidationTests, MissingTextureDescriptor) {
// Test an error occurs if the texture descriptor is invalid
TEST_P(VulkanImageWrappingValidationTests, InvalidTextureDescriptor) {
DAWN_SKIP_TEST_IF(UsesWire());
defaultDescriptor.nextInChain = this;
wgpu::ChainedStruct chainedDescriptor;
defaultDescriptor.nextInChain = &chainedDescriptor;
ASSERT_DEVICE_ERROR(wgpu::Texture texture = WrapVulkanImage(
device, &defaultDescriptor, defaultFd, defaultAllocationSize,