• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2021 The Dawn Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "src/dawn_node/binding/GPURenderPassEncoder.h"
16 
17 #include "src/dawn_node/binding/Converter.h"
18 #include "src/dawn_node/binding/GPUBindGroup.h"
19 #include "src/dawn_node/binding/GPUBuffer.h"
20 #include "src/dawn_node/binding/GPUQuerySet.h"
21 #include "src/dawn_node/binding/GPURenderBundle.h"
22 #include "src/dawn_node/binding/GPURenderPipeline.h"
23 #include "src/dawn_node/utils/Debug.h"
24 
25 namespace wgpu { namespace binding {
26 
27     ////////////////////////////////////////////////////////////////////////////////
28     // wgpu::bindings::GPURenderPassEncoder
29     ////////////////////////////////////////////////////////////////////////////////
GPURenderPassEncoder(wgpu::RenderPassEncoder enc)30     GPURenderPassEncoder::GPURenderPassEncoder(wgpu::RenderPassEncoder enc) : enc_(std::move(enc)) {
31     }
32 
setViewport(Napi::Env,float x,float y,float width,float height,float minDepth,float maxDepth)33     void GPURenderPassEncoder::setViewport(Napi::Env,
34                                            float x,
35                                            float y,
36                                            float width,
37                                            float height,
38                                            float minDepth,
39                                            float maxDepth) {
40         enc_.SetViewport(x, y, width, height, minDepth, maxDepth);
41     }
42 
setScissorRect(Napi::Env,interop::GPUIntegerCoordinate x,interop::GPUIntegerCoordinate y,interop::GPUIntegerCoordinate width,interop::GPUIntegerCoordinate height)43     void GPURenderPassEncoder::setScissorRect(Napi::Env,
44                                               interop::GPUIntegerCoordinate x,
45                                               interop::GPUIntegerCoordinate y,
46                                               interop::GPUIntegerCoordinate width,
47                                               interop::GPUIntegerCoordinate height) {
48         enc_.SetScissorRect(x, y, width, height);
49     }
50 
setBlendConstant(Napi::Env env,interop::GPUColor color)51     void GPURenderPassEncoder::setBlendConstant(Napi::Env env, interop::GPUColor color) {
52         Converter conv(env);
53 
54         wgpu::Color c{};
55         if (!conv(c, color)) {
56             return;
57         }
58 
59         enc_.SetBlendConstant(&c);
60     }
61 
setStencilReference(Napi::Env,interop::GPUStencilValue reference)62     void GPURenderPassEncoder::setStencilReference(Napi::Env, interop::GPUStencilValue reference) {
63         enc_.SetStencilReference(reference);
64     }
65 
beginOcclusionQuery(Napi::Env,interop::GPUSize32 queryIndex)66     void GPURenderPassEncoder::beginOcclusionQuery(Napi::Env, interop::GPUSize32 queryIndex) {
67         enc_.BeginOcclusionQuery(queryIndex);
68     }
69 
endOcclusionQuery(Napi::Env)70     void GPURenderPassEncoder::endOcclusionQuery(Napi::Env) {
71         enc_.EndOcclusionQuery();
72     }
73 
beginPipelineStatisticsQuery(Napi::Env,interop::Interface<interop::GPUQuerySet> querySet,interop::GPUSize32 queryIndex)74     void GPURenderPassEncoder::beginPipelineStatisticsQuery(
75         Napi::Env,
76         interop::Interface<interop::GPUQuerySet> querySet,
77         interop::GPUSize32 queryIndex) {
78         UNIMPLEMENTED();
79     }
80 
endPipelineStatisticsQuery(Napi::Env)81     void GPURenderPassEncoder::endPipelineStatisticsQuery(Napi::Env) {
82         UNIMPLEMENTED();
83     }
84 
writeTimestamp(Napi::Env env,interop::Interface<interop::GPUQuerySet> querySet,interop::GPUSize32 queryIndex)85     void GPURenderPassEncoder::writeTimestamp(Napi::Env env,
86                                               interop::Interface<interop::GPUQuerySet> querySet,
87                                               interop::GPUSize32 queryIndex) {
88         Converter conv(env);
89 
90         wgpu::QuerySet q{};
91         if (!conv(q, querySet)) {
92             return;
93         }
94 
95         enc_.WriteTimestamp(q, queryIndex);
96     }
97 
executeBundles(Napi::Env env,std::vector<interop::Interface<interop::GPURenderBundle>> bundles_in)98     void GPURenderPassEncoder::executeBundles(
99         Napi::Env env,
100         std::vector<interop::Interface<interop::GPURenderBundle>> bundles_in) {
101         Converter conv(env);
102 
103         wgpu::RenderBundle* bundles = nullptr;
104         uint32_t bundleCount = 0;
105         if (!conv(bundles, bundleCount, bundles_in)) {
106             return;
107         }
108 
109         enc_.ExecuteBundles(bundleCount, bundles);
110     }
111 
endPass(Napi::Env)112     void GPURenderPassEncoder::endPass(Napi::Env) {
113         enc_.EndPass();
114     }
115 
setBindGroup(Napi::Env env,interop::GPUIndex32 index,interop::Interface<interop::GPUBindGroup> bindGroup,std::vector<interop::GPUBufferDynamicOffset> dynamicOffsets)116     void GPURenderPassEncoder::setBindGroup(
117         Napi::Env env,
118         interop::GPUIndex32 index,
119         interop::Interface<interop::GPUBindGroup> bindGroup,
120         std::vector<interop::GPUBufferDynamicOffset> dynamicOffsets) {
121         Converter conv(env);
122 
123         wgpu::BindGroup bg{};
124         uint32_t* offsets = nullptr;
125         uint32_t num_offsets = 0;
126         if (!conv(bg, bindGroup) || !conv(offsets, num_offsets, dynamicOffsets)) {
127             return;
128         }
129 
130         enc_.SetBindGroup(index, bg, num_offsets, offsets);
131     }
132 
setBindGroup(Napi::Env env,interop::GPUIndex32 index,interop::Interface<interop::GPUBindGroup> bindGroup,interop::Uint32Array dynamicOffsetsData,interop::GPUSize64 dynamicOffsetsDataStart,interop::GPUSize32 dynamicOffsetsDataLength)133     void GPURenderPassEncoder::setBindGroup(Napi::Env env,
134                                             interop::GPUIndex32 index,
135                                             interop::Interface<interop::GPUBindGroup> bindGroup,
136                                             interop::Uint32Array dynamicOffsetsData,
137                                             interop::GPUSize64 dynamicOffsetsDataStart,
138                                             interop::GPUSize32 dynamicOffsetsDataLength) {
139         Converter conv(env);
140 
141         wgpu::BindGroup bg{};
142         if (!conv(bg, bindGroup)) {
143             return;
144         }
145 
146         enc_.SetBindGroup(index, bg, dynamicOffsetsDataLength,
147                           dynamicOffsetsData.Data() + dynamicOffsetsDataStart);
148     }
149 
pushDebugGroup(Napi::Env,std::string groupLabel)150     void GPURenderPassEncoder::pushDebugGroup(Napi::Env, std::string groupLabel) {
151         enc_.PushDebugGroup(groupLabel.c_str());
152     }
153 
popDebugGroup(Napi::Env)154     void GPURenderPassEncoder::popDebugGroup(Napi::Env) {
155         enc_.PopDebugGroup();
156     }
157 
insertDebugMarker(Napi::Env,std::string markerLabel)158     void GPURenderPassEncoder::insertDebugMarker(Napi::Env, std::string markerLabel) {
159         enc_.InsertDebugMarker(markerLabel.c_str());
160     }
161 
setPipeline(Napi::Env env,interop::Interface<interop::GPURenderPipeline> pipeline)162     void GPURenderPassEncoder::setPipeline(
163         Napi::Env env,
164         interop::Interface<interop::GPURenderPipeline> pipeline) {
165         Converter conv(env);
166         wgpu::RenderPipeline rp{};
167         if (!conv(rp, pipeline)) {
168             return;
169         }
170         enc_.SetPipeline(rp);
171     }
172 
setIndexBuffer(Napi::Env env,interop::Interface<interop::GPUBuffer> buffer,interop::GPUIndexFormat indexFormat,interop::GPUSize64 offset,std::optional<interop::GPUSize64> size)173     void GPURenderPassEncoder::setIndexBuffer(Napi::Env env,
174                                               interop::Interface<interop::GPUBuffer> buffer,
175                                               interop::GPUIndexFormat indexFormat,
176                                               interop::GPUSize64 offset,
177                                               std::optional<interop::GPUSize64> size) {
178         Converter conv(env);
179 
180         wgpu::Buffer b{};
181         wgpu::IndexFormat f;
182         uint64_t s = wgpu::kWholeSize;
183         if (!conv(b, buffer) ||       //
184             !conv(f, indexFormat) ||  //
185             !conv(s, size)) {
186             return;
187         }
188         enc_.SetIndexBuffer(b, f, offset, s);
189     }
190 
setVertexBuffer(Napi::Env env,interop::GPUIndex32 slot,interop::Interface<interop::GPUBuffer> buffer,interop::GPUSize64 offset,std::optional<interop::GPUSize64> size)191     void GPURenderPassEncoder::setVertexBuffer(Napi::Env env,
192                                                interop::GPUIndex32 slot,
193                                                interop::Interface<interop::GPUBuffer> buffer,
194                                                interop::GPUSize64 offset,
195                                                std::optional<interop::GPUSize64> size) {
196         Converter conv(env);
197 
198         wgpu::Buffer b{};
199         uint64_t s = wgpu::kWholeSize;
200         if (!conv(b, buffer) || !conv(s, size)) {
201             return;
202         }
203         enc_.SetVertexBuffer(slot, b, offset, s);
204     }
205 
draw(Napi::Env env,interop::GPUSize32 vertexCount,interop::GPUSize32 instanceCount,interop::GPUSize32 firstVertex,interop::GPUSize32 firstInstance)206     void GPURenderPassEncoder::draw(Napi::Env env,
207                                     interop::GPUSize32 vertexCount,
208                                     interop::GPUSize32 instanceCount,
209                                     interop::GPUSize32 firstVertex,
210                                     interop::GPUSize32 firstInstance) {
211         enc_.Draw(vertexCount, instanceCount, firstVertex, firstInstance);
212     }
213 
drawIndexed(Napi::Env env,interop::GPUSize32 indexCount,interop::GPUSize32 instanceCount,interop::GPUSize32 firstIndex,interop::GPUSignedOffset32 baseVertex,interop::GPUSize32 firstInstance)214     void GPURenderPassEncoder::drawIndexed(Napi::Env env,
215                                            interop::GPUSize32 indexCount,
216                                            interop::GPUSize32 instanceCount,
217                                            interop::GPUSize32 firstIndex,
218                                            interop::GPUSignedOffset32 baseVertex,
219                                            interop::GPUSize32 firstInstance) {
220         enc_.DrawIndexed(indexCount, instanceCount, firstIndex, baseVertex, firstInstance);
221     }
222 
drawIndirect(Napi::Env env,interop::Interface<interop::GPUBuffer> indirectBuffer,interop::GPUSize64 indirectOffset)223     void GPURenderPassEncoder::drawIndirect(Napi::Env env,
224                                             interop::Interface<interop::GPUBuffer> indirectBuffer,
225                                             interop::GPUSize64 indirectOffset) {
226         Converter conv(env);
227 
228         wgpu::Buffer b{};
229         uint32_t o = 0;
230 
231         if (!conv(b, indirectBuffer) ||  //
232             !conv(o, indirectOffset)) {
233             return;
234         }
235         enc_.DrawIndirect(b, o);
236     }
237 
drawIndexedIndirect(Napi::Env env,interop::Interface<interop::GPUBuffer> indirectBuffer,interop::GPUSize64 indirectOffset)238     void GPURenderPassEncoder::drawIndexedIndirect(
239         Napi::Env env,
240         interop::Interface<interop::GPUBuffer> indirectBuffer,
241         interop::GPUSize64 indirectOffset) {
242         Converter conv(env);
243 
244         wgpu::Buffer b{};
245         uint32_t o = 0;
246 
247         if (!conv(b, indirectBuffer) ||  //
248             !conv(o, indirectOffset)) {
249             return;
250         }
251         enc_.DrawIndexedIndirect(b, o);
252     }
253 
getLabel(Napi::Env)254     std::optional<std::string> GPURenderPassEncoder::getLabel(Napi::Env) {
255         UNIMPLEMENTED();
256     }
257 
setLabel(Napi::Env,std::optional<std::string> value)258     void GPURenderPassEncoder::setLabel(Napi::Env, std::optional<std::string> value) {
259         UNIMPLEMENTED();
260     }
261 
262 }}  // namespace wgpu::binding
263