[webkit-changes] [WebKit/WebKit] 7db946: [WebGPU] Timestamp writes only work in vary specif...

Myles C. Maxfield noreply at github.com
Mon Feb 6 14:01:28 PST 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 7db946a6f19e50aa9ff1243097142c2a46a89e43
      https://github.com/WebKit/WebKit/commit/7db946a6f19e50aa9ff1243097142c2a46a89e43
  Author: Myles C. Maxfield <mmaxfield at apple.com>
  Date:   2023-02-06 (Mon, 06 Feb 2023)

  Changed paths:
    M Source/WebGPU/WebGPU/CommandEncoder.h
    M Source/WebGPU/WebGPU/CommandEncoder.mm
    M Source/WebGPU/WebGPU/ComputePassEncoder.h
    M Source/WebGPU/WebGPU/ComputePassEncoder.mm
    M Source/WebGPU/WebGPU/HardwareCapabilities.h
    M Source/WebGPU/WebGPU/HardwareCapabilities.mm
    M Source/WebGPU/WebGPU/RenderPassEncoder.h
    M Source/WebGPU/WebGPU/RenderPassEncoder.mm
    M Source/WebGPU/WebGPU/RenderPipeline.mm

  Log Message:
  -----------
  [WebGPU] Timestamp writes only work in vary specific situations
https://bugs.webkit.org/show_bug.cgi?id=251773
rdar://105067419

Reviewed by Tadeu Zagallo.

Before this patch, the infrastructure for timestamp writes is very specific:
- Only Apple Silicon machines are supported
- CommandEncoder.writeTimestamp() is not supported
- ComputePassDescriptor.timestampWrites are not supported
- RenderPassDescriptor.timestampWrites is supported, but only for the first element,
      and only for specific hardcoded values of queryIndex

This patch generalizes support:

In Metal, different devices support different query set APIs. You have to call
[MTLDevice supportsCounterSampling:] to know which kind of device you're on. Apple
Silicon devices report that they only support counter sampling on stage boundaries,
via the pass descriptors' sampleBufferAttachments. All other devices (that I've
tried) report that they support counter sampling on individual command boundaries.
If a device doesn't support either of these granularities, then it just won't
support the timestamp queries feature in the first place.

For pass descriptors' timestampWrites array, if the device is an Apple Silicon device,
we are supposed to be able to naively transform the timestampWrites into
sampleBufferAttachments, which is what this patch does. However, rdar://91371495 is
about how that doesn't actually work; a follow-up patch is necessary to work around
this. For non-Apple-Silicon devices, we implement the timestampWrites array by just
calling -[CommandEncoder sampleCountersInBuffer:] at the beginning and end of the pass.

For CommandEncoder.writeTimestamp(), we can implement this on Apple Silicon devices by
creating a dummy blit pass, and setting sampleBufferAttachments on it. We want to
coalesce multiple writes into a single blit pass, so we defer doing this as long as
possible - until either we would have had to make a blit pass anyway, we have to start
a new pass, or the command encoder is ending. For non-Apple-Silicon devices,
CommandEncoder.writeTimestamp() directly turns into
-[MTLBlitCommandEncoder sampleCountersInBuffer:].

Because of rdar://91371495, this patch isn't actually fully-functional; however,
the existing infrastructure wasn't fully-functional either, so I'm kind of viewing this
patch as not-a-regression. My next patch will work around rdar://91371495.

* Source/WebGPU/WebGPU/CommandEncoder.h:
* Source/WebGPU/WebGPU/CommandEncoder.mm:
(WebGPU::CommandEncoder::ensureBlitCommandEncoder):
(WebGPU::CommandEncoder::finalizeBlitCommandEncoder):
(WebGPU::CommandEncoder::validateComputePassDescriptor const):
(WebGPU::CommandEncoder::beginComputePass):
(WebGPU::CommandEncoder::validateRenderPassDescriptor const):
(WebGPU::CommandEncoder::beginRenderPass):
(WebGPU::CommandEncoder::writeTimestamp):
* Source/WebGPU/WebGPU/ComputePassEncoder.h:
(WebGPU::ComputePassEncoder::create):
* Source/WebGPU/WebGPU/ComputePassEncoder.mm:
(WebGPU::ComputePassEncoder::ComputePassEncoder):
(WebGPU::ComputePassEncoder::endPass):
* Source/WebGPU/WebGPU/HardwareCapabilities.h:
* Source/WebGPU/WebGPU/HardwareCapabilities.mm:
(WebGPU::baseCapabilities):
(WebGPU::mergeBaseCapabilities):
* Source/WebGPU/WebGPU/RenderPassEncoder.h:
(WebGPU::RenderPassEncoder::create):
* Source/WebGPU/WebGPU/RenderPassEncoder.mm:
(WebGPU::RenderPassEncoder::RenderPassEncoder):
(WebGPU::RenderPassEncoder::endPass):
* Source/WebGPU/WebGPU/RenderPipeline.mm:
(WebGPU::createVertexDescriptor):

Canonical link: https://commits.webkit.org/259914@main




More information about the webkit-changes mailing list