Improve various error messages

Improves various error messages that have received feeback indicating
that they were too confusing or poorly worded.

Bug: dawn:1152
Bug: dawn:1157
Change-Id: If740300f31278ab04d4493887c03918a09cf0f86
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/68100
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Brandon Jones <bajones@chromium.org>
diff --git a/src/dawn_native/Buffer.cpp b/src/dawn_native/Buffer.cpp
index 70343e2..43337cc 100644
--- a/src/dawn_native/Buffer.cpp
+++ b/src/dawn_native/Buffer.cpp
@@ -110,15 +110,17 @@
             wgpu::BufferUsage::MapWrite | wgpu::BufferUsage::CopySrc;
         DAWN_INVALID_IF(
             usage & wgpu::BufferUsage::MapWrite && !IsSubset(usage, kMapWriteAllowedUsages),
-            "Buffer usages (%s) contains %s but is not a subset of %s.", usage,
-            wgpu::BufferUsage::MapWrite, kMapWriteAllowedUsages);
+            "Buffer usages (%s) is invalid. If a buffer usage contains %s the only other allowed "
+            "usage is %s.",
+            usage, wgpu::BufferUsage::MapWrite, wgpu::BufferUsage::CopySrc);
 
         const wgpu::BufferUsage kMapReadAllowedUsages =
             wgpu::BufferUsage::MapRead | wgpu::BufferUsage::CopyDst;
         DAWN_INVALID_IF(
             usage & wgpu::BufferUsage::MapRead && !IsSubset(usage, kMapReadAllowedUsages),
-            "Buffer usages (%s) contains %s but is not a subset of %s.", usage,
-            wgpu::BufferUsage::MapRead, kMapReadAllowedUsages);
+            "Buffer usages (%s) is invalid. If a buffer usage contains %s the only other allowed "
+            "usage is %s.",
+            usage, wgpu::BufferUsage::MapRead, wgpu::BufferUsage::CopyDst);
 
         DAWN_INVALID_IF(descriptor->mappedAtCreation && descriptor->size % 4 != 0,
                         "Buffer is mapped at creation but its size (%u) is not a multiple of 4.",
diff --git a/src/dawn_native/CommandBufferStateTracker.cpp b/src/dawn_native/CommandBufferStateTracker.cpp
index 45892a6..9d64934 100644
--- a/src/dawn_native/CommandBufferStateTracker.cpp
+++ b/src/dawn_native/CommandBufferStateTracker.cpp
@@ -238,6 +238,8 @@
             return {};
         }
 
+        DAWN_INVALID_IF(aspects[VALIDATION_ASPECT_PIPELINE], "No pipeline set.");
+
         if (DAWN_UNLIKELY(aspects[VALIDATION_ASPECT_INDEX_BUFFER])) {
             DAWN_INVALID_IF(!mIndexBufferSet, "Index buffer was not set.");
 
@@ -263,15 +265,43 @@
 
         if (DAWN_UNLIKELY(aspects[VALIDATION_ASPECT_BIND_GROUPS])) {
             for (BindGroupIndex i : IterateBitSet(mLastPipelineLayout->GetBindGroupLayoutsMask())) {
+                ASSERT(HasPipeline());
+
                 DAWN_INVALID_IF(mBindgroups[i] == nullptr, "No bind group set at index %u.",
                                 static_cast<uint32_t>(i));
 
+                BindGroupLayoutBase* requiredBGL = mLastPipelineLayout->GetBindGroupLayout(i);
+                BindGroupLayoutBase* currentBGL = mBindgroups[i]->GetLayout();
+
+                DAWN_INVALID_IF(
+                    requiredBGL->GetPipelineCompatibilityToken() != PipelineCompatibilityToken(0) &&
+                        currentBGL->GetPipelineCompatibilityToken() !=
+                            requiredBGL->GetPipelineCompatibilityToken(),
+                    "The current pipeline (%s) was created with a default layout, and is not "
+                    "compatible with the %s at index %u which uses a %s that was not created by "
+                    "the pipeline. Either use the bind group layout returned by calling "
+                    "getBindGroupLayout(%u) on the pipeline when creating the bind group, or "
+                    "provide an explicit pipeline layout when creating the pipeline.",
+                    mLastPipeline, mBindgroups[i], static_cast<uint32_t>(i), currentBGL,
+                    static_cast<uint32_t>(i));
+
+                DAWN_INVALID_IF(
+                    requiredBGL->GetPipelineCompatibilityToken() == PipelineCompatibilityToken(0) &&
+                        currentBGL->GetPipelineCompatibilityToken() !=
+                            PipelineCompatibilityToken(0),
+                    "%s at index %u uses a %s which was created as part of the default layout for "
+                    "a different pipeline than the current one (%s), and as a result is not "
+                    "compatible. Use an explicit bind group layout when creating bind groups and "
+                    "an explicit pipeline layout when creating pipelines to share bind groups "
+                    "between pipelines.",
+                    mBindgroups[i], static_cast<uint32_t>(i), currentBGL, mLastPipeline);
+
                 DAWN_INVALID_IF(
                     mLastPipelineLayout->GetBindGroupLayout(i) != mBindgroups[i]->GetLayout(),
                     "Bind group layout %s of pipeline layout %s does not match layout %s of bind "
                     "group %s at index %u.",
-                    mLastPipelineLayout->GetBindGroupLayout(i), mLastPipelineLayout,
-                    mBindgroups[i]->GetLayout(), mBindgroups[i], static_cast<uint32_t>(i));
+                    requiredBGL, mLastPipelineLayout, currentBGL, mBindgroups[i],
+                    static_cast<uint32_t>(i));
 
                 // TODO(dawn:563): Report the binding sizes and which ones are failing.
                 DAWN_INVALID_IF(!BufferSizesAtLeastAsBig(mBindgroups[i]->GetUnverifiedBufferSizes(),
@@ -288,8 +318,6 @@
             return DAWN_FORMAT_VALIDATION_ERROR("Bind groups are invalid.");
         }
 
-        DAWN_INVALID_IF(aspects[VALIDATION_ASPECT_PIPELINE], "No pipeline set.");
-
         UNREACHABLE();
     }