Show encoder in command buffer/render bundle messages

Having labels like [CommandBuffer from CommandEncoder "B"] will
provide greater context when developers don't provide labels to
every tier of object.

Bug: dawn:1746
Change-Id: Ibf72f97e054ff943b33c210e457422466e46a013
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/127120
Commit-Queue: Brandon Jones <bajones@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
Brandon Jones 2023-04-26 21:19:29 +00:00 committed by Dawn LUCI CQ
parent 47dd30117d
commit 1040f0e087
13 changed files with 110 additions and 42 deletions

View File

@ -29,7 +29,8 @@ CommandBufferBase::CommandBufferBase(CommandEncoder* encoder,
const CommandBufferDescriptor* descriptor)
: ApiObjectBase(encoder->GetDevice(), descriptor->label),
mCommands(encoder->AcquireCommands()),
mResourceUsages(encoder->AcquireResourceUsages()) {
mResourceUsages(encoder->AcquireResourceUsages()),
mEncoderLabel(encoder->GetLabel()) {
GetObjectTrackingList()->Track(this);
}
@ -47,6 +48,28 @@ ObjectType CommandBufferBase::GetType() const {
return ObjectType::CommandBuffer;
}
void CommandBufferBase::FormatLabel(absl::FormatSink* s) const {
s->Append(ObjectTypeAsString(GetType()));
const std::string& label = GetLabel();
if (!label.empty()) {
s->Append(absl::StrFormat(" \"%s\"", label));
}
if (!mEncoderLabel.empty()) {
s->Append(absl::StrFormat(" from %s \"%s\"", ObjectTypeAsString(ObjectType::CommandEncoder),
mEncoderLabel));
}
}
const std::string& CommandBufferBase::GetEncoderLabel() const {
return mEncoderLabel;
}
void CommandBufferBase::SetEncoderLabel(std::string encoderLabel) {
mEncoderLabel = encoderLabel;
}
MaybeError CommandBufferBase::ValidateCanUseInSubmitNow() const {
ASSERT(!IsError());

View File

@ -15,6 +15,8 @@
#ifndef SRC_DAWN_NATIVE_COMMANDBUFFER_H_
#define SRC_DAWN_NATIVE_COMMANDBUFFER_H_
#include <string>
#include "dawn/native/dawn_platform.h"
#include "dawn/native/CommandAllocator.h"
@ -37,6 +39,10 @@ class CommandBufferBase : public ApiObjectBase {
static CommandBufferBase* MakeError(DeviceBase* device, const char* label);
ObjectType GetType() const override;
void FormatLabel(absl::FormatSink* s) const override;
const std::string& GetEncoderLabel() const;
void SetEncoderLabel(std::string encoderLabel);
MaybeError ValidateCanUseInSubmitNow() const;
@ -53,6 +59,8 @@ class CommandBufferBase : public ApiObjectBase {
CommandBufferBase(DeviceBase* device, ObjectBase::ErrorTag tag, const char* label);
CommandBufferResourceUsage mResourceUsages;
std::string mEncoderLabel;
};
bool IsCompleteSubresourceCopiedTo(const TextureBase* texture,

View File

@ -1596,7 +1596,10 @@ CommandBufferBase* CommandEncoder::APIFinish(const CommandBufferDescriptor* desc
Ref<CommandBufferBase> commandBuffer;
if (GetDevice()->ConsumedError(Finish(descriptor), &commandBuffer)) {
return CommandBufferBase::MakeError(GetDevice(), descriptor ? descriptor->label : nullptr);
CommandBufferBase* errorCommandBuffer =
CommandBufferBase::MakeError(GetDevice(), descriptor ? descriptor->label : nullptr);
errorCommandBuffer->SetEncoderLabel(this->GetLabel());
return errorCommandBuffer;
}
ASSERT(!IsError());
return commandBuffer.Detach();

View File

@ -14,8 +14,10 @@
#include <mutex>
#include "absl/strings/str_format.h"
#include "dawn/native/Device.h"
#include "dawn/native/ObjectBase.h"
#include "dawn/native/ObjectType_autogen.h"
namespace dawn::native {
@ -99,6 +101,13 @@ const std::string& ApiObjectBase::GetLabel() const {
return mLabel;
}
void ApiObjectBase::FormatLabel(absl::FormatSink* s) const {
s->Append(ObjectTypeAsString(GetType()));
if (!mLabel.empty()) {
s->Append(absl::StrFormat(" \"%s\"", mLabel));
}
}
void ApiObjectBase::SetLabelImpl() {}
bool ApiObjectBase::IsAlive() const {

View File

@ -22,6 +22,10 @@
#include "dawn/common/RefCounted.h"
#include "dawn/native/Forward.h"
namespace absl {
class FormatSink;
}
namespace dawn::native {
class ApiObjectBase;
@ -85,6 +89,8 @@ class ApiObjectBase : public ObjectBase, public LinkNode<ApiObjectBase> {
virtual ObjectType GetType() const = 0;
const std::string& GetLabel() const;
virtual void FormatLabel(absl::FormatSink* s) const;
// The ApiObjectBase is considered alive if it is tracked in a respective linked list owned
// by the owning device.
bool IsAlive() const;

View File

@ -15,6 +15,8 @@
#ifndef SRC_DAWN_NATIVE_PROGRAMMABLEENCODER_H_
#define SRC_DAWN_NATIVE_PROGRAMMABLEENCODER_H_
#include <string>
#include "dawn/native/CommandEncoder.h"
#include "dawn/native/Error.h"
#include "dawn/native/Forward.h"

View File

@ -16,6 +16,7 @@
#include <utility>
#include "absl/strings/str_format.h"
#include "dawn/common/BitSetIterator.h"
#include "dawn/native/Commands.h"
#include "dawn/native/Device.h"
@ -38,7 +39,8 @@ RenderBundleBase::RenderBundleBase(RenderBundleEncoder* encoder,
mDepthReadOnly(depthReadOnly),
mStencilReadOnly(stencilReadOnly),
mDrawCount(encoder->GetDrawCount()),
mResourceUsage(std::move(resourceUsage)) {
mResourceUsage(std::move(resourceUsage)),
mEncoderLabel(encoder->GetLabel()) {
GetObjectTrackingList()->Track(this);
}
@ -62,6 +64,28 @@ ObjectType RenderBundleBase::GetType() const {
return ObjectType::RenderBundle;
}
void RenderBundleBase::FormatLabel(absl::FormatSink* s) const {
s->Append(ObjectTypeAsString(GetType()));
const std::string& label = GetLabel();
if (!label.empty()) {
s->Append(absl::StrFormat(" \"%s\"", label));
}
if (!mEncoderLabel.empty()) {
s->Append(absl::StrFormat(
" from %s \"%s\"", ObjectTypeAsString(ObjectType::RenderBundleEncoder), mEncoderLabel));
}
}
const std::string& RenderBundleBase::GetEncoderLabel() const {
return mEncoderLabel;
}
void RenderBundleBase::SetEncoderLabel(std::string encoderLabel) {
mEncoderLabel = encoderLabel;
}
CommandIterator* RenderBundleBase::GetCommands() {
return &mCommands;
}

View File

@ -16,6 +16,7 @@
#define SRC_DAWN_NATIVE_RENDERBUNDLE_H_
#include <bitset>
#include <string>
#include "dawn/common/Constants.h"
#include "dawn/native/AttachmentState.h"
@ -46,6 +47,10 @@ class RenderBundleBase final : public ApiObjectBase {
static RenderBundleBase* MakeError(DeviceBase* device, const char* label);
ObjectType GetType() const override;
void FormatLabel(absl::FormatSink* s) const override;
const std::string& GetEncoderLabel() const;
void SetEncoderLabel(std::string encoderLabel);
CommandIterator* GetCommands();
@ -68,6 +73,7 @@ class RenderBundleBase final : public ApiObjectBase {
bool mStencilReadOnly;
uint64_t mDrawCount;
RenderPassResourceUsage mResourceUsage;
std::string mEncoderLabel;
};
} // namespace dawn::native

View File

@ -142,7 +142,10 @@ RenderBundleBase* RenderBundleEncoder::APIFinish(const RenderBundleDescriptor* d
if (GetDevice()->ConsumedError(FinishImpl(descriptor), &result, "calling %s.Finish(%s).", this,
descriptor)) {
return RenderBundleBase::MakeError(GetDevice(), descriptor ? descriptor->label : nullptr);
RenderBundleBase* errorRenderBundle =
RenderBundleBase::MakeError(GetDevice(), descriptor ? descriptor->label : nullptr);
errorRenderBundle->SetEncoderLabel(this->GetLabel());
return errorRenderBundle;
}
return result;

View File

@ -15,6 +15,7 @@
#include "dawn/native/Texture.h"
#include <algorithm>
#include <string>
#include "dawn/common/Assert.h"
#include "dawn/common/Constants.h"
@ -865,6 +866,24 @@ ObjectType TextureViewBase::GetType() const {
return ObjectType::TextureView;
}
void TextureViewBase::FormatLabel(absl::FormatSink* s) const {
s->Append(ObjectTypeAsString(GetType()));
const std::string& label = GetLabel();
if (!label.empty()) {
s->Append(absl::StrFormat(" \"%s\"", label));
}
if (IsError()) {
return;
}
const std::string& textureLabel = mTexture->GetLabel();
if (!textureLabel.empty()) {
s->Append(" of ");
GetTexture()->FormatLabel(s);
}
}
const TextureBase* TextureViewBase::GetTexture() const {
ASSERT(!IsError());
return mTexture.Get();

View File

@ -143,6 +143,7 @@ class TextureViewBase : public ApiObjectBase {
static TextureViewBase* MakeError(DeviceBase* device, const char* label = nullptr);
ObjectType GetType() const override;
void FormatLabel(absl::FormatSink* s) const override;
const TextureBase* GetTexture() const;
TextureBase* GetTexture();

View File

@ -22,6 +22,7 @@
#include "dawn/native/Format.h"
#include "dawn/native/ObjectBase.h"
#include "dawn/native/PerStage.h"
#include "dawn/native/ProgrammableEncoder.h"
#include "dawn/native/ShaderModule.h"
#include "dawn/native/Subresource.h"
#include "dawn/native/Surface.h"
@ -156,36 +157,7 @@ absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConv
if (value->IsError()) {
s->Append("Invalid ");
}
s->Append(ObjectTypeAsString(value->GetType()));
const std::string& label = value->GetLabel();
if (!label.empty()) {
s->Append(absl::StrFormat(" \"%s\"", label));
}
s->Append("]");
return {true};
}
absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConvert(
const TextureViewBase* value,
const absl::FormatConversionSpec& spec,
absl::FormatSink* s) {
if (value == nullptr) {
s->Append("[null]");
return {true};
}
s->Append("[");
if (value->IsError()) {
s->Append("Invalid ");
}
s->Append(ObjectTypeAsString(value->GetType()));
const std::string& label = value->GetLabel();
if (!label.empty()) {
s->Append(absl::StrFormat(" \"%s\"", label));
}
const std::string& textureLabel = value->GetTexture()->GetLabel();
if (!textureLabel.empty()) {
s->Append(absl::StrFormat(" of Texture \"%s\"", textureLabel));
}
value->FormatLabel(s);
s->Append("]");
return {true};
}

View File

@ -75,14 +75,6 @@ absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConv
const absl::FormatConversionSpec& spec,
absl::FormatSink* s);
// Special case for TextureViews, since frequently the texture will be the
// thing that's labeled.
class TextureViewBase;
absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConvert(
const TextureViewBase* value,
const absl::FormatConversionSpec& spec,
absl::FormatSink* s);
class AttachmentState;
absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConvert(
const AttachmentState* value,