profile
viewpoint

haoxli/zjs-demos 2

Sample applications and demos for Zephyr.js

haoxli/demo-express 0

A demo application to showcase Crosswalk's features and APIs

haoxli/deno 0

A secure TypeScript runtime on V8

haoxli/gpuweb 0

Where the GPU for the Web work happens!

haoxli/jrs-debugger-tests 0

Auto tests for Zephyr.js JerryScript debugger

push eventhaoxli/gpuweb

Hao Li

commit sha b278bbf1ad473c26f6280c3fd83cc53f32fb7502

Remove flag of precise occlusion Co-Authored-By: Kai Ninomiya <kainino1@gmail.com>

view details

push time in 6 days

push eventhaoxli/gpuweb

Hao Li

commit sha ebcf25a220568b3fcf903cddbc13b7c06d24bc94

Remove precise occlusion extension Co-Authored-By: Kai Ninomiya <kainino1@gmail.com>

view details

push time in 6 days

push eventhaoxli/gpuweb

Hao Li

commit sha e49cefb0e78ce4e434db7232e85d01a648bfa9e2

Remove other query types Co-Authored-By: Kai Ninomiya <kainino1@gmail.com>

view details

push time in 6 days

issue commentgpuweb/gpuweb

Investigation: Query API

I also checked that it seems only Vulkan support specifying a stage of the pipeline in vkCmdWriteTimestamp.

Add a mechanism for getting a GPUCommandBuffer start and end time that's unrelated to queries.

As mentioned above, on Metal, GPUStartTime and GPUEndTime are internal attributes in command buffer which always can be read when commands are completed. On D3D12 and Vulkan, we need to use timestamp query to get the timestamp at the beginning and end of command buffer. Maybe we also need a flag in encoders to turn the timing mechanism on, otherwise need enable the mechanism for all command buffers.

haoxli

comment created time in 7 days

pull request commentgpuweb/gpuweb

Add Query API

I will splite this PR to small ones to make it merged easily. First for occlusion query: https://github.com/gpuweb/gpuweb/pull/656

haoxli

comment created time in 7 days

Pull request review commentgpuweb/gpuweb

Add Query API

 dictionary GPUFenceDescriptor : GPUObjectDescriptorBase { </script>  +Queries {#queries}+================++## QuerySet ## {#queryset}++<script type=idl>+interface GPUQuerySet {+    GPUQueryType getQueryType();+    GPUSize32 getQueryCount();++    void destroy();

I'm not sure if I understood correctly, QuerySet should be allocated in a continuous memory on GPU like buffers for storing query data, so I think it need the destory() method.

haoxli

comment created time in 7 days

Pull request review commentgpuweb/gpuweb

Add Query API

 dictionary GPUFenceDescriptor : GPUObjectDescriptorBase { </script>  +Queries {#queries}+================++## QuerySet ## {#queryset}++<script type=idl>+interface GPUQuerySet {+    GPUQueryType getQueryType();+    GPUSize32 getQueryCount();

I've removed the getters, will add them as internal attributes in spec. At beginning I want to get the size of query data by this method when resolving, instead of passing in a actual number.

haoxli

comment created time in 7 days

Pull request review commentgpuweb/gpuweb

Add Query API

 dictionary GPUFenceDescriptor : GPUObjectDescriptorBase { </script>  +Queries {#queries}+================++## QuerySet ## {#queryset}++<script type=idl>+interface GPUQuerySet {+    GPUQueryType getQueryType();+    GPUSize32 getQueryCount();++    void destroy();+};+GPUQuerySet includes GPUObjectBase;+</script>++### Creation ### {#queryset-creation}++<script type=idl>+dictionary GPUQuerySetDescriptor : GPUObjectDescriptorBase {+    required GPUQueryType type;+    required GPUSize32 count;+};+</script>++## QueryType ## {#querytype}++<script type=idl>+enum GPUQueryType {+    "occlusion",+    "pipelinestatistics",

Done

haoxli

comment created time in 7 days

Pull request review commentgpuweb/gpuweb

Add Query API

 interface GPURenderPassEncoder {     void setBlendColor(GPUColor color);     void setStencilReference(GPUStencilValue reference); +    void beginOcclusionQuery(GPUSize32 queryIndex, boolean preciseOcclusion);

Done

haoxli

comment created time in 7 days

push eventhaoxli/gpuweb

Li, Hao

commit sha 2092f73c0eefab364b8562807efb63c6c1f96080

Query API: Add Occlusion Query Add the definition of Occlusion Query and its requirements. * Add precise occlusion query as extension. * Define QuerySet, QuerySetDescriptor and QueryType. * Add query set in render pass descriptor for occlusion query. * Add begin/endOcclusionQuery on render pass encoder. * Resolve query result from query set on command encoder. * Add a new buffer usage for resolving query result.

view details

push time in 7 days

PR opened gpuweb/gpuweb

Query API: Add Occlusion Query

Add the definition of Occlusion Query and its requirements

  • Add precise occlusion query as extension.
  • Define QuerySet, QuerySetDescriptor and QueryType.
  • Add query set in render pass descriptor for occlusion query.
  • Add begin/endOcclusionQuery on render pass encoder.
  • Resolve query result from query set on command encoder.
  • Add a new buffer usage for resolving query result.
+57 -10

0 comment

1 changed file

pr created time in 7 days

create barnchhaoxli/gpuweb

branch : query-api-occlusion

created branch time in 10 days

push eventhaoxli/gpuweb

dan sinclair

commit sha 7e08b4bb02f900f1294841f7a24b516d40ebbee6

[wgsl] Fixup VertexIdx SPIR-V example. (#651) The VertexIdx was incorrectly set to convert to the VertexId instead of the VertexIndex SPIR-V decoration.

view details

push time in 10 days

push eventhaoxli/gpuweb

Dzmitry Malyshau

commit sha fc49fe6dccc3245c92aa9b70516afe5ec21d4811

Rename bindings to entries for consistency (#611)

view details

dan sinclair

commit sha a7b43af7078c353349018f08cdc880c2537d3cfa

Remove push constant from WGSL. (#615) It was decided that push constants will not be in WebGPU at this point. Remove references from the WGSL spec. Fixes #612

view details

Dzmitry Malyshau

commit sha d097ec095b4ecaeed84d5116403fb43a93bc5909

[wgsl] intrinsic and derivative expression (#604) Fixes #603

view details

Kai Ninomiya

commit sha 7f4b88a205760e1d1e1160a383e40f6802412c00

Spec bytesPerRow and rowsPerImage (#608) These have been renamed from rowPitch and imageHeight. Also touches some surrounding material/definitions.

view details

Kai Ninomiya

commit sha 7531dda46a6fa81b37d804a0c1486d095426aeea

Merge arrayLayerCount into size.depth (#613)

view details

Kai Ninomiya

commit sha 041fd0212f03f6f789cc0b45c45215612f7ae45c

Synchronization section: editing nits (#607)

view details

Dzmitry Malyshau

commit sha 0a48816412b5d08a5fb8b89005e019165a1a2c63

Reorder fields of GPUBindGroupLayoutEntry (#618)

view details

Mehmet Oguz Derin

commit sha 2e86cff113ef035499df95b39b33bef1439c4f5a

Update index.bs (#628) Fix loop example

view details

Jeff Gilbert

commit sha 2ce1971a4617cff5287a472763cfd4cd261af1cf

Bump python to 3.7 for Travis. (#633) * Bump python to 3.7 for Travis. Bikeshed now requires 3.7. * fix extract-idl.py for python3 Co-authored-by: Kai Ninomiya <kainino@chromium.org>

view details

Jiawei Shao

commit sha 29138ee8aeaee31716d29f3c365e545ad227cb86

Add definitions about copy commands with textures (#623) * Define multiple concepts about copy commands with textures This patch adds several definitions that are required in the validation rules of copy commands with textures. - the internal slots of a GPUTexture - texel block - texel block size - texel block width - texel block height - the physical size of a texture subresource * Address reviewer's feedbacks * Format the example in the "physical size" section * Address more comments from reviewers

view details

Jeff Gilbert

commit sha c4b3bca57362b751d0ad65c98b857767e26cbbac

Spec how canvas compositing happens with SwapChains. (#627) * Spec how canvas compositing happens with SwapChains. * Update spec/index.bs Co-Authored-By: Kai Ninomiya <kainino1@gmail.com> Co-authored-by: Kai Ninomiya <kainino1@gmail.com>

view details

Mehmet Oguz Derin

commit sha 78fef8e798604d2e96fd6a78184f192d828c8646

Match VERTEX declaration to the rest of the definitions #634 Matches VERTEX declaration to the rest of the definitions

view details

Mehmet Oguz Derin

commit sha c1252857d9e3eec2c6ac582c26617db0eed40851

Convert SEMICLON to SEMICOLON #635

view details

Dzmitry Malyshau

commit sha 2c7f2621916e347f2dfa8a4fc651b5787218404d

Change threading uniforms to be uint (#636)

view details

Mehmet Oguz Derin

commit sha 22e38b0af2535715e0a8691b7d55935f669746b4

Conform for loop example to the statements syntax #638 As per the definition of statements, the statement given inside the loop needs to be terminated by a semicolon. This pull request aims to match example to the definition.

view details

Jeff Gilbert

commit sha 5048a91354dcfb80df8d136b4c6de13297ff9c1c

Convert 0xa0 to space in wgsl/index.bs. (#641) It looks like this was the only non-ASCII, at least.

view details

Kai Ninomiya

commit sha d00a99c5382f13405ee8e5465654aaf738a6b55e

Minor toplevel copyediting (#637)

view details

push time in 11 days

issue commentgpuweb/gpuweb

Investigation: Query API

iOS has had GPUStartTime and GPUEndTime since iOS 10.3. I think we should modify the existing timestamp queries to be able to be implemented via these methods so WebGPU code would work out-of-the-box on iOS.

Maybe the timestamp query extension could be unsupported on iOS, or a different one designed to reflect the timestamp on the command buffer?

GPUStartTime and GPUEndTime are very different from timestamp query. They are command buffer properties and does not need those query operations, and retrieved from CPU memory directly when the commands are completed. So it's better to have a separated interface on command buffer to get the timestamps. On Metal(iOS and macOS), they are queried in the addCompletedHandler: callback, or after a call to the waitUntilCompleted method. On D3D12 and Vulkan, we can insert timestamp queries at the beginning and end of command encoder, and read the timestamps back from resolved buffer when the commands are compeleted (after a call to ID3D12Fence or vkQueueWaitIdle).

haoxli

comment created time in 17 days

issue commentgpuweb/gpuweb

Investigation: Query API

This would also mean timestamp queries could have a single writeTimestamp method instead of begin/end. The proposal explains that we could return time deltas, but imho the application can do a subtraction themselves, and if we really need to, we normalize the timestamps so they don't leak device-specific information.

In addition to eliminating the difference in timestamps across platforms, another reason to add begin/end for timestmaps is to make the three types of queries share the same set of interfaces as much as possible. We thought about using a single method like writeTimestamp in timestamp query, this has the advantage that the user can calculate the delta between any timestamp. We can nomalize the results by storing the difference of each timestamp with the first one, for example: <table> <tr align="center"> <td>Actual Timestamps</td> <td>10000</td> <td>10002</td> <td>10005</td> <td>9999</td> <td>10003</td> </tr> <tr align="center"> <td>Resolved into buffer</td> <td>0</td> <td>2</td> <td>5</td> <td>0</td> <td>4</td> </tr> </table> If a timestamp is reset, we will store it as 0, the next timestamp will be computed based on the reset one.

But there are also some problems, such as:

  1. We need to investigate if this can achieved by the compute shader.
  2. Users need to make sure that there is no zero value between the two timestamps when calculating the delta. For example, if we calculate the delta of the second value and fifth value in above table, even if the result is positive, it is invalid.
haoxli

comment created time in 17 days

PR opened gpuweb/gpuweb

Add Query API

Add the definition of Query API and its requirements according to gpuweb#614.

  • Add extensions.
  • Define QuerySet, QuerySetDescriptor and QueryType.
  • Create QuerySet on GPU device.
  • Set query set in render pass descriptor for occlusion query.
  • Add separated begin/end method for occlusion query on render pass encoder.
  • Add begin/end method for pipeline statistics and timestamp queries on render pass encoder and compute pass encoder.
  • Resolve query result from query set on command encoder.
  • Add a new buffer usage for resolving query result.
+68 -10

0 comment

1 changed file

pr created time in 20 days

push eventhaoxli/gpuweb

Li, Hao

commit sha 8c5ead9f2bb91c7e930d45fc09bed092bb80c7db

Add Query API Add the definition of Query API and its requirements according to gpuweb#614. * Add extensions. * Define QuerySet, QuerySetDescriptor and QueryType. * Create QuerySet on GPU device. * Set query set in render pass descriptor for occlusion query. * Add separated begin/end method for occlusion query on render pass encoder. * Add begin/end method for pipeline statistics and timestamp queries on render pass encoder and compute pass encoder. * Resolve query result from query set on command encoder. * Add a new buffer usage for resolving query result.

view details

push time in 20 days

create barnchhaoxli/gpuweb

branch : query-api-idl

created branch time in 20 days

fork haoxli/gpuweb

Where the GPU for the Web work happens!

https://webgpu.io

fork in 21 days

issue openedgpuweb/gpuweb

Investigation: Query API

Motivation

Modern graphics APIs have their query mechanism to get the information about the processing of a sequence of commands on GPU, and mainly support three types:

  • Occlusion Query: Count the number of samples passed depth/stencil testing or whether samples passed the testing. This feature is used to determine visibility or even measure the area of geometry, such as predicated rendering (#551).
  • Pipeline Statistics Query: Count various aspects of the operation of graphics or compute pipelines, such as the number of vertex shader invocations, the number of primitives processed by the clip stage, etc.. We can use these statistics informations to get a measure of relative complexity of different parts of application, which could help to find bottlenecks while performance tuning.
  • Timestamp Query: Get timestamps generated by device. It can be used to measure the execution time of commands on GPU while performance tuning.

We expect to have such a mechanism to get these informations on WebGPU, here is the investigation about the support of these queries on D3D12, Metal and Vulkan.

Native APIs

Native APIs Support

Query Types D3D12 Metal Vulkan
Occlusion Supported macOS 10.11+ <br> iOS 8+ Binary Occlusion: supported <br> Precise Occlusion: <br> VkPhysicalDeviceFeatures.occlusionQueryPrecise == true <br> Device Coverage: 98.9% Windows, 97.3% Linux, 10.6% Android
Pipeline Statistics Supported macOS 10.15+ <br> No iOS VkPhysicalDeviceFeatures.pipelineStatisticsQuery == true <br> Device Coverage: 99.5% Windows, 99.5% Linux, 58.7% Android
Timestamp Supported macOS 10.15+ Supported
  • Binary occlusion query is supported in all native APIs, precise occlusion query and pipeline statistics query are optional features on Vulkan which need to be enabled at device creation time.
  • Pipeline statistics and timestamp queries are not available on Metal until macOS 10.15+.
  • On iOS 10.3+, it starts to support GPU time (GPUStartTime and GPUEndTime) but only for the whole command buffer.
  • So we can expose the binary occlusion query as a core feature, other queries as extensions.

Query Object

Query object is a collection of a specific number of queries of a particular type.

The query objects on native APIs are created with descriptor (D3D12_QUERY_HEAP_DESC, MTLCounterSampleBufferDescriptor, VkQueryPoolCreateInfo) which specify query type and query count, expect for visibilityResultBuffer on Metal, which is a MTLBuffer and set in render pass descriptor when the render pass is creating.

The query objects are passed as an argument to query operations and need to be destroyed like Vulkan did.

Query Types

Query Types D3D12 Metal Vulkan
Occlusion D3D12_QUERY_HEAP_TYPE<br>_OCCLUSION MTLVisibilityResultMode VK_QUERY_TYPE_OCC<br>LUSION
Pipeline Statistics D3D12_QUERY_HEAP_TYPE<br>_PIPELINE_STATISTICS MTLCommonCounterSetStatistic VK_QUERY_TYPE_PIP<br>ELINE_STATISTICS
Timestamp D3D12_QUERY_HEAP_TYPE<br>_TIMESTAMP MTLCommonCounterSetTimestamp VK_QUERY_TYPE_TIM<br>ESTAMP

On Metal, it has no query type but uses MTLVisibilityResultMode for occlusion query, and stores query results in a MTLBuffer directly. Other queries have their types for creating query objects on each backend.

Query Operations

<table> <tr> <th rowspan="2">Query Types</th> <th colspan="2">D3D12</th> <th colspan="2">Metal</th> <th colspan="3">Vulkan</th> </tr> <tr> <td><a href="https://docs.microsoft.com/en-us/windows/desktop/api/d3d12/nf-d3d12-id3d12graphicscommandlist-beginquery">Begin<br>Query</a></td> <td><a href="https://docs.microsoft.com/en-us/windows/desktop/api/d3d12/nf-d3d12-id3d12graphicscommandlist-endquery">EndQ<br>uery</a></td> <td><a href="https://developer.apple.com/documentation/metal/mtlrendercommandencoder/1515556-setvisibilityresultmode">setVisib<br>ilityResu<br>ltMode</a></td> <td><a href="https://developer.apple.com/search/?q=sampleCountersInBuffer">sampleC<br>ounters<br>InBuffer</a></td> <td><a href="https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#vkCmdBeginQuery">vkCmdBe<br>ginQuery</a></td> <td><a href="https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#vkCmdEndQuery">vkCmdE<br>ndQuery</a></td> <td><a href="https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#vkCmdWriteTimestamp">vkCmdW<br>riteTimes<br>tamp</a></td> </tr> <tr align="center"> <td>Occlusion</td> <td>√</td> <td>√</td> <td>√</td> <td> </td> <td>√</td> <td>√</td> <td> </td> </tr> <tr align="center"> <td>Pipeline<br>Statistic</td> <td>√</td> <td>√</td> <td> </td> <td>√</td> <td>√</td> <td>√</td> <td> </td> </tr> <tr align="center"> <td>Timestamp</td> <td> </td> <td>√</td> <td> </td> <td>√</td> <td> </td> <td> </td> <td>√</td> </tr> </table>

Occlusion Query:

  • On Metal, it calls a separate API named setVisibiltyResultMode with Boolean/Disabled to begin/end binary occlusion query (Counting for precise occlusion query).
  • D3D12 and Vulkan have begin and end operations. D3D12 controls binary/precise queries when calling BeginQuery with query type of D3D12_QUERY_TYPE_BINARY_OCCLUSION or D3D12_QUERY_TYPE_OCCLUSION, Vulkan controls them via call vkCmdBeginQuery with control flags.

Pipeline Statistics Query:

  • On Metal, it performs pipeline statistics query by calling a new API on macOS 10.15+ named sampleCountersInBuffer, it does NOT begin and end statistics in a range of commands like D3D12 and Vulkan, but does statistics from the beginning of render (or compute or blit) encoder to where sampleCountersInBuffer is called.
  • To implement pipeline statistics query on Metal, we can call sampleCountersInBuffer twice (one for Begin() and other for End()) inside a render (or compute or blit) encoder, and stores the difference of the two query results in the result buffer.

Timestamp Query:

  • Unlike occlusion and pipeline statistics queries, timestamp query does NOT operate over a range, but writes timestamps generated by device to query objects.
  • The meanings of the timestamp results queried from native APIs are not clear. Timestamps are different on D3D12 (GPU ticks), Metal (nanoseconds) and Vulkan (nanoseconds), and not all timestamps can be converted to specific dates, which is platform dependent.
  • So it’s better to have begin/end operations for timestamp query for exposing time delta instead of timestamp which may be more useful.

These operations on native APIs have different scopes:

Query Types D3D12 Metal Vulkan
Occlusion Inside or outside render pass on Direct Command List Inside render encoder Inside or outside render pass on Graphics Queue
Pipeline<br>Statistic Inside or outside render pass on Direct Command List Inside render/compute/blit encoders Inside or outside render pass on Graphics and Compute Queues
Timestamp Inside or outside render pass on Direct nad Compute Command Lists Inside render/compute/blit encoders Inside or outside render pass on Graphics and Compute Queues

Pipeline statistics query is only supported on Direct Command List on D3D12, but ID3D12GraphicsCommandList::Dispatch() can execute commands in a compute shader.

Resolve Query Results

Query Types D3D12 Metal Vulkan
Resolve APIs ResolveQueryData resolveCounters vkGetQueryPoolResults<br>vkCmdCopyQueryPoolResults
Binary Occlusion Result Binary 0/1 resolved into a buffer Non-zero or zero integer stored in buffer Non-zero or zero integer resolved into a buffer
Precise Occlusion Result The number of samples passed depth and stencil tests The number of samples passed depth and stencil tests The number of samples passed scissor, exclusive scissor, sample mask, alpha to coverage, stencil, and depth tests
Pipeline Statistics Result <a href="https://docs.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_query_data_pipeline_statistics">D3D12_QUERY_DATA_<br>PIPELINE_STATISTICS</a> <a href="https://developer.apple.com/documentation/metal/mtlcounterresultstatistic?language=objc">MTLCounterResult<br>Statistic</a> <a href="https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#queries-pipestats">VkQueryPipelineStatistic<br>FlagBits</a>
Timestamp Result GPU Ticks resolved into a buffer.<br> Timestamp (in ns) =<br>Timestamp(in ticks) * 10<sup>9</sup>/<br>ID3D12CommandQueue::<br><a href="https://docs.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12commandqueue-gettimestampfrequency">GetTimestampFrequency()</a> Nanoseconds resolved into a buffer Nanoseconds resolved into a buffer
  • All native APIs support resolving the results from query objects to a buffer memory, the destination buffer can be accessed by following pipeline, such as using as conditional for the predicated rendering.
  • Resolve operation must be outside render pass on D3D12 and Vulkan or render/compute encoder on Metal.
  • The state or usage of the destination buffer must be COPY_DEST on D3D12, MTLStorageModeShared or MTLStorageModePrivate on Metal, UNIFORM_BUFFER and TRANSFER_DST on Vulkan.
  • The offset in destination buffer must be a multiple of 8 bytes on D3D12 and Vulkan (resolve results as 64-bit).
  • For occlusion query, Vulkan specifies more tests in its spec, but these tests will also affect the occlusion results on D3D12 and Metal. If the depth/stencil tests are disabled, then the results is simply the area of the rasterized primitives.
  • The query results are resolved as 32-bit or 64-bit unsigned integers with flag on Vulkan, and always resolved as 64-bit unsigned integers on D3D12 and Metal.
  • We cannot return the results buffer directly because we need to perform post-processing by compute shader after getting the raw query results from the native APIs.
    • Unify the results of binary occlusion queries.
    • Compute the counters in pipeline statistics results which are different on three native APIs, we prefer to expose the common parts of them.
    • Compute the difference of the two timestamp queries. The time delta may be negative due to the timestamp counter may be reset after a long time on some platforms. We can suggest users to skip the invalid time delta if it’s negative.

Proposal

Extensions

Add precise occlusion, pipeline statistics and timestamp queries in GPUExtensionName.

QuerySet

  • Define QuerySet instead of individual query objects because Query objects (or sample buffers on Metal) can be allocated in a continuous part of memory.
  • Create and destroy QuerySet on GPUDevice.
  • Set query set in GPURenderPassDescriptor for occlusion query due to Metal requires visibilityResultsBuffer in MTLRenderPassDescriptor at render pass creation time.

Begin/End Query

  • Occlusion query only supports begin/end on render pass encoder without passing query set which has been set in render pass descriptor.
  • Pipeline statistics and timestamp queries support begin/end on both render pass encoder and compute pass encoder.
  • We may need to perform different types of queries in the same render/compute pass encoder, so it’s better to pass a query set in beginQuery/endQuery for pipeline statistics and timestamp queries.

Resolve Query

Retrieve query results from query set, users can read the results from buffer memory or consume the result buffer directly.

  • Queries results are resolved into GPU buffer:
Query Types Resolved Results
Binary Occlusion 0/1
Precise Occlusion The number of samples passed depth/stencil tests.
Pipeline Statistics The number of<br>vertex shader invocations,<br>primitives processed by the clip stage,<br> primitives output by the clip stage,<br> fragment shader invocations,<br> compute shader invocations.
Timestamp Time delta in nanoseconds.<br>0 for invalid results which need to be skipped.
  • All results in the GPU buffer are stored in a type of GPUSize64. The offset must be a multiple of 8 bytes.
  • Add a new GPUBuffer usage for resolving queries, which avoid to expose more detailed information about buffer usage, and can be reused in predicated or conditional rendering.

created time in 21 days

more