Emit warning if zero-size dispatch/draw
This CL make sure developers are warned when zero-size dispatches and draws occur. Even though those are valid, it is good to encourage developers to avoid them when possible. Bug: dawn:1786 Change-Id: I99cbe8d556569d2e779b7b9c64739c3e5da8e290 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/132222 Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Austin Eng <enga@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Fr <beaufort.francois@gmail.com>
This commit is contained in:
parent
9f83fa1d1b
commit
48e2b114be
|
@ -183,6 +183,12 @@ void ComputePassEncoder::APIDispatchWorkgroups(uint32_t workgroupCountX,
|
||||||
this,
|
this,
|
||||||
[&](CommandAllocator* allocator) -> MaybeError {
|
[&](CommandAllocator* allocator) -> MaybeError {
|
||||||
if (IsValidationEnabled()) {
|
if (IsValidationEnabled()) {
|
||||||
|
if (workgroupCountX == 0 || workgroupCountY == 0 || workgroupCountZ == 0) {
|
||||||
|
GetDevice()->EmitWarningOnce(absl::StrFormat(
|
||||||
|
"Calling %s.DispatchWorkgroups with a workgroup count of 0 is unusual.",
|
||||||
|
this));
|
||||||
|
}
|
||||||
|
|
||||||
DAWN_TRY(mCommandBufferState.ValidateCanDispatch());
|
DAWN_TRY(mCommandBufferState.ValidateCanDispatch());
|
||||||
|
|
||||||
uint32_t workgroupsPerDimension =
|
uint32_t workgroupsPerDimension =
|
||||||
|
|
|
@ -1436,6 +1436,12 @@ void DeviceBase::EmitDeprecationWarning(const std::string& message) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DeviceBase::EmitWarningOnce(const std::string& message) {
|
||||||
|
if (mWarnings.insert(message).second) {
|
||||||
|
this->EmitLog(WGPULoggingType_Warning, message.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DeviceBase::EmitLog(const char* message) {
|
void DeviceBase::EmitLog(const char* message) {
|
||||||
this->EmitLog(WGPULoggingType_Info, message);
|
this->EmitLog(WGPULoggingType_Info, message);
|
||||||
}
|
}
|
||||||
|
|
|
@ -364,6 +364,7 @@ class DeviceBase : public RefCountedWithExternalCount {
|
||||||
void IncrementLazyClearCountForTesting();
|
void IncrementLazyClearCountForTesting();
|
||||||
size_t GetDeprecationWarningCountForTesting();
|
size_t GetDeprecationWarningCountForTesting();
|
||||||
void EmitDeprecationWarning(const std::string& warning);
|
void EmitDeprecationWarning(const std::string& warning);
|
||||||
|
void EmitWarningOnce(const std::string& message);
|
||||||
void EmitLog(const char* message);
|
void EmitLog(const char* message);
|
||||||
void EmitLog(WGPULoggingType loggingType, const char* message);
|
void EmitLog(WGPULoggingType loggingType, const char* message);
|
||||||
void APIForceLoss(wgpu::DeviceLostReason reason, const char* message);
|
void APIForceLoss(wgpu::DeviceLostReason reason, const char* message);
|
||||||
|
@ -597,6 +598,8 @@ class DeviceBase : public RefCountedWithExternalCount {
|
||||||
struct DeprecationWarnings;
|
struct DeprecationWarnings;
|
||||||
std::unique_ptr<DeprecationWarnings> mDeprecationWarnings;
|
std::unique_ptr<DeprecationWarnings> mDeprecationWarnings;
|
||||||
|
|
||||||
|
std::unordered_set<std::string> mWarnings;
|
||||||
|
|
||||||
State mState = State::BeingCreated;
|
State mState = State::BeingCreated;
|
||||||
|
|
||||||
PerObjectType<ApiObjectList> mObjectLists;
|
PerObjectType<ApiObjectList> mObjectLists;
|
||||||
|
|
|
@ -93,6 +93,15 @@ void RenderEncoderBase::APIDraw(uint32_t vertexCount,
|
||||||
this,
|
this,
|
||||||
[&](CommandAllocator* allocator) -> MaybeError {
|
[&](CommandAllocator* allocator) -> MaybeError {
|
||||||
if (IsValidationEnabled()) {
|
if (IsValidationEnabled()) {
|
||||||
|
if (vertexCount == 0) {
|
||||||
|
GetDevice()->EmitWarningOnce(absl::StrFormat(
|
||||||
|
"Calling %s.Draw with a vertex count of 0 is unusual.", this));
|
||||||
|
}
|
||||||
|
if (instanceCount == 0) {
|
||||||
|
GetDevice()->EmitWarningOnce(absl::StrFormat(
|
||||||
|
"Calling %s.Draw with an instance count of 0 is unusual.", this));
|
||||||
|
}
|
||||||
|
|
||||||
DAWN_TRY(mCommandBufferState.ValidateCanDraw());
|
DAWN_TRY(mCommandBufferState.ValidateCanDraw());
|
||||||
|
|
||||||
DAWN_INVALID_IF(mDisableBaseInstance && firstInstance != 0,
|
DAWN_INVALID_IF(mDisableBaseInstance && firstInstance != 0,
|
||||||
|
@ -127,6 +136,15 @@ void RenderEncoderBase::APIDrawIndexed(uint32_t indexCount,
|
||||||
this,
|
this,
|
||||||
[&](CommandAllocator* allocator) -> MaybeError {
|
[&](CommandAllocator* allocator) -> MaybeError {
|
||||||
if (IsValidationEnabled()) {
|
if (IsValidationEnabled()) {
|
||||||
|
if (indexCount == 0) {
|
||||||
|
GetDevice()->EmitWarningOnce(absl::StrFormat(
|
||||||
|
"Calling %s.Draw with an index count of 0 is unusual.", this));
|
||||||
|
}
|
||||||
|
if (instanceCount == 0) {
|
||||||
|
GetDevice()->EmitWarningOnce(absl::StrFormat(
|
||||||
|
"Calling %s.Draw with an instance count of 0 is unusual.", this));
|
||||||
|
}
|
||||||
|
|
||||||
DAWN_TRY(mCommandBufferState.ValidateCanDrawIndexed());
|
DAWN_TRY(mCommandBufferState.ValidateCanDrawIndexed());
|
||||||
|
|
||||||
DAWN_INVALID_IF(mDisableBaseInstance && firstInstance != 0,
|
DAWN_INVALID_IF(mDisableBaseInstance && firstInstance != 0,
|
||||||
|
|
Loading…
Reference in New Issue