/* * Copyright 2019 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "src/gpu/dawn/GrDawnProgramDataManager.h" #include "src/gpu/dawn/GrDawnGpu.h" GrDawnProgramDataManager::GrDawnProgramDataManager(const UniformInfoArray& uniforms, uint32_t uniformBufferSize) : GrUniformDataManager(uniforms.count(), uniformBufferSize) { memset(fUniformData.get(), 0, uniformBufferSize); // We must add uniforms in same order is the UniformInfoArray so that UniformHandles already // owned by other objects will still match up here. int i = 0; for (const auto& uniformInfo : uniforms.items()) { Uniform& uniform = fUniforms[i]; SkDEBUGCODE( uniform.fArrayCount = uniformInfo.fVariable.getArrayCount(); uniform.fType = uniformInfo.fVariable.getType(); ) uniform.fOffset = uniformInfo.fUBOOffset; ++i; } } static wgpu::BindGroupEntry make_bind_group_entry(uint32_t binding, const wgpu::Buffer& buffer, uint32_t offset, uint32_t size) { wgpu::BindGroupEntry result; result.binding = binding; result.buffer = buffer; result.offset = offset; result.size = size; result.sampler = nullptr; result.textureView = nullptr; return result; } wgpu::BindGroup GrDawnProgramDataManager::uploadUniformBuffers(GrDawnGpu* gpu, wgpu::BindGroupLayout layout) { if (fUniformsDirty && 0 != fUniformSize) { std::vector bindings; GrDawnRingBuffer::Slice slice; slice = gpu->allocateUniformRingBufferSlice(fUniformSize); gpu->queue().WriteBuffer(slice.fBuffer, slice.fOffset, fUniformData.get(), fUniformSize); bindings.push_back(make_bind_group_entry(GrSPIRVUniformHandler::kUniformBinding, slice.fBuffer, slice.fOffset, fUniformSize)); wgpu::BindGroupDescriptor descriptor; descriptor.layout = layout; descriptor.entryCount = bindings.size(); descriptor.entries = bindings.data(); fBindGroup = gpu->device().CreateBindGroup(&descriptor); fUniformsDirty = false; } return fBindGroup; }