Mark pipeline overridable constants as unsafe
Until all backend implementations are done. Bug: dawn:1169 Change-Id: I16d184bec03bbc9a255ad33cf11aa615b1986389 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/67422 Commit-Queue: Shrek Shao <shrekshao@google.com> Reviewed-by: Austin Eng <enga@chromium.org>
This commit is contained in:
parent
83d8966a26
commit
f4c8a6ac9b
|
@ -45,6 +45,12 @@ namespace dawn_native {
|
||||||
DAWN_TRY(ValidateCompatibilityWithPipelineLayout(device, metadata, layout));
|
DAWN_TRY(ValidateCompatibilityWithPipelineLayout(device, metadata, layout));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (constantCount > 0u && device->IsToggleEnabled(Toggle::DisallowUnsafeAPIs)) {
|
||||||
|
return DAWN_VALIDATION_ERROR(
|
||||||
|
"Pipeline overridable constants are disallowed because they are partially "
|
||||||
|
"implemented.");
|
||||||
|
}
|
||||||
|
|
||||||
// Validate if overridable constants exist in shader module
|
// Validate if overridable constants exist in shader module
|
||||||
// pipelineBase is not yet constructed at this moment so iterate constants from descriptor
|
// pipelineBase is not yet constructed at this moment so iterate constants from descriptor
|
||||||
for (uint32_t i = 0; i < constantCount; i++) {
|
for (uint32_t i = 0; i < constantCount; i++) {
|
||||||
|
|
|
@ -631,6 +631,10 @@ namespace dawn_native {
|
||||||
auto metadata = std::make_unique<EntryPointMetadata>();
|
auto metadata = std::make_unique<EntryPointMetadata>();
|
||||||
|
|
||||||
if (!entryPoint.overridable_constants.empty()) {
|
if (!entryPoint.overridable_constants.empty()) {
|
||||||
|
DAWN_INVALID_IF(device->IsToggleEnabled(Toggle::DisallowUnsafeAPIs),
|
||||||
|
"Pipeline overridable constants are disallowed because they "
|
||||||
|
"are partially implemented.");
|
||||||
|
|
||||||
const auto& name2Id = inspector.GetConstantNameToIdMap();
|
const auto& name2Id = inspector.GetConstantNameToIdMap();
|
||||||
|
|
||||||
for (auto& c : entryPoint.overridable_constants) {
|
for (auto& c : entryPoint.overridable_constants) {
|
||||||
|
|
|
@ -106,6 +106,46 @@ TEST_F(UnsafeAPIValidationTest, DynamicStorageBuffer) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check that pipeline overridable constants are disallowed as part of unsafe APIs.
|
||||||
|
// TODO(dawn:1041) Remove when implementation for all backend is added
|
||||||
|
TEST_F(UnsafeAPIValidationTest, PipelineOverridableConstants) {
|
||||||
|
// Create the dummy compute pipeline.
|
||||||
|
wgpu::ComputePipelineDescriptor pipelineDescBase;
|
||||||
|
pipelineDescBase.compute.entryPoint = "main";
|
||||||
|
|
||||||
|
// Control case: shader without overridable constant is allowed.
|
||||||
|
{
|
||||||
|
wgpu::ComputePipelineDescriptor pipelineDesc = pipelineDescBase;
|
||||||
|
pipelineDesc.compute.module =
|
||||||
|
utils::CreateShaderModule(device, "[[stage(compute), workgroup_size(1)]] fn main() {}");
|
||||||
|
|
||||||
|
device.CreateComputePipeline(&pipelineDesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error case: shader with overridable constant with default value
|
||||||
|
{
|
||||||
|
ASSERT_DEVICE_ERROR(utils::CreateShaderModule(device, R"(
|
||||||
|
[[override(1000)]] let c0: u32 = 1u;
|
||||||
|
[[override(1000)]] let c1: u32;
|
||||||
|
|
||||||
|
[[stage(compute), workgroup_size(1)]] fn main() {
|
||||||
|
ignore(c0);
|
||||||
|
ignore(c1);
|
||||||
|
})"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error case: pipeline stage with constant entry is disallowed
|
||||||
|
{
|
||||||
|
wgpu::ComputePipelineDescriptor pipelineDesc = pipelineDescBase;
|
||||||
|
pipelineDesc.compute.module =
|
||||||
|
utils::CreateShaderModule(device, "[[stage(compute), workgroup_size(1)]] fn main() {}");
|
||||||
|
std::vector<wgpu::ConstantEntry> constants{{nullptr, "c", 1u}};
|
||||||
|
pipelineDesc.compute.constants = constants.data();
|
||||||
|
pipelineDesc.compute.constantCount = constants.size();
|
||||||
|
ASSERT_DEVICE_ERROR(device.CreateComputePipeline(&pipelineDesc));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class UnsafeQueryAPIValidationTest : public ValidationTest {
|
class UnsafeQueryAPIValidationTest : public ValidationTest {
|
||||||
protected:
|
protected:
|
||||||
WGPUDevice CreateTestDevice() override {
|
WGPUDevice CreateTestDevice() override {
|
||||||
|
|
Loading…
Reference in New Issue