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