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:
parent
9b6872dd00
commit
895bc934bb
|
@ -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(
|
||||
|
|
|
@ -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]);
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue