Implement zero-sized QuerySet

- Add zero-sized implementation in each backend.
- Test creating zero-sized query set for each type.

Bug: dawn:954
Change-Id: Ib2b8a7d890dae6ee40f5a05aac570a4600dedab8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/56260
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jiawei Shao <jiawei.shao@intel.com>
Commit-Queue: Hao Li <hao.x.li@intel.com>
This commit is contained in:
Li Hao 2021-06-29 08:04:00 +00:00 committed by Dawn LUCI CQ
parent 9b6872dd00
commit 895bc934bb
4 changed files with 31 additions and 13 deletions

View File

@ -43,7 +43,7 @@ namespace dawn_native { namespace d3d12 {
MaybeError QuerySet::Initialize() {
D3D12_QUERY_HEAP_DESC queryHeapDesc = {};
queryHeapDesc.Type = D3D12QueryHeapType(GetQueryType());
queryHeapDesc.Count = GetQueryCount();
queryHeapDesc.Count = std::max(GetQueryCount(), uint32_t(1u));
ID3D12Device* d3d12Device = ToBackend(GetDevice())->GetD3D12Device();
return CheckOutOfMemoryHRESULT(

View File

@ -42,7 +42,7 @@ namespace dawn_native { namespace metal {
}
ASSERT(descriptor.counterSet != nullptr);
descriptor.sampleCount = count;
descriptor.sampleCount = static_cast<NSUInteger>(std::max(count, uint32_t(1u)));
descriptor.storageMode = MTLStorageModePrivate;
if (device->IsToggleEnabled(Toggle::MetalUseSharedModeForCounterSampleBuffer)) {
descriptor.storageMode = MTLStorageModeShared;
@ -75,7 +75,8 @@ namespace dawn_native { namespace metal {
switch (GetQueryType()) {
case wgpu::QueryType::Occlusion: {
// Create buffer for writing 64-bit results.
NSUInteger bufferSize = static_cast<NSUInteger>(GetQueryCount() * sizeof(uint64_t));
NSUInteger bufferSize = static_cast<NSUInteger>(
std::max(GetQueryCount() * sizeof(uint64_t), size_t(4u)));
mVisibilityBuffer = AcquireNSPRef([device->GetMTLDevice()
newBufferWithLength:bufferSize
options:MTLResourceStorageModePrivate]);

View File

@ -77,7 +77,7 @@ namespace dawn_native { namespace vulkan {
createInfo.pNext = NULL;
createInfo.flags = 0;
createInfo.queryType = VulkanQueryType(GetQueryType());
createInfo.queryCount = GetQueryCount();
createInfo.queryCount = std::max(GetQueryCount(), uint32_t(1u));
if (GetQueryType() == wgpu::QueryType::PipelineStatistics) {
createInfo.pipelineStatistics =
VulkanQueryPipelineStatisticFlags(GetPipelineStatistics());

View File

@ -215,6 +215,9 @@ class OcclusionQueryTests : public QueryTests {
// Test creating query set with the type of Occlusion
TEST_P(OcclusionQueryTests, QuerySetCreation) {
// Zero-sized query set is allowed.
CreateOcclusionQuerySet(0);
CreateOcclusionQuerySet(1);
}
@ -461,19 +464,30 @@ class PipelineStatisticsQueryTests : public QueryTests {
return requiredExtensions;
}
wgpu::QuerySet CreateQuerySetForPipelineStatistics(
uint32_t queryCount,
std::vector<wgpu::PipelineStatisticName> pipelineStatistics = {}) {
wgpu::QuerySetDescriptor descriptor;
descriptor.count = queryCount;
descriptor.type = wgpu::QueryType::PipelineStatistics;
if (pipelineStatistics.size() > 0) {
descriptor.pipelineStatistics = pipelineStatistics.data();
descriptor.pipelineStatisticsCount = pipelineStatistics.size();
}
return device.CreateQuerySet(&descriptor);
}
};
// Test creating query set with the type of PipelineStatistics
TEST_P(PipelineStatisticsQueryTests, QuerySetCreation) {
wgpu::QuerySetDescriptor descriptor;
descriptor.count = 1;
descriptor.type = wgpu::QueryType::PipelineStatistics;
wgpu::PipelineStatisticName pipelineStatistics[2] = {
wgpu::PipelineStatisticName::ClipperInvocations,
wgpu::PipelineStatisticName::VertexShaderInvocations};
descriptor.pipelineStatistics = pipelineStatistics;
descriptor.pipelineStatisticsCount = 2;
device.CreateQuerySet(&descriptor);
// Zero-sized query set is allowed.
CreateQuerySetForPipelineStatistics(0, {wgpu::PipelineStatisticName::ClipperInvocations,
wgpu::PipelineStatisticName::VertexShaderInvocations});
CreateQuerySetForPipelineStatistics(1, {wgpu::PipelineStatisticName::ClipperInvocations,
wgpu::PipelineStatisticName::VertexShaderInvocations});
}
DAWN_INSTANTIATE_TEST(PipelineStatisticsQueryTests,
@ -529,6 +543,9 @@ class TimestampQueryTests : public QueryTests {
// Test creating query set with the type of Timestamp
TEST_P(TimestampQueryTests, QuerySetCreation) {
// Zero-sized query set is allowed.
CreateQuerySetForTimestamp(0);
CreateQuerySetForTimestamp(1);
}