1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2019 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "src/gpu/dawn/GrDawnProgramDataManager.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "src/gpu/dawn/GrDawnGpu.h" 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_ciGrDawnProgramDataManager::GrDawnProgramDataManager(const UniformInfoArray& uniforms, 13cb93a386Sopenharmony_ci uint32_t uniformBufferSize) 14cb93a386Sopenharmony_ci : GrUniformDataManager(uniforms.count(), uniformBufferSize) { 15cb93a386Sopenharmony_ci memset(fUniformData.get(), 0, uniformBufferSize); 16cb93a386Sopenharmony_ci // We must add uniforms in same order is the UniformInfoArray so that UniformHandles already 17cb93a386Sopenharmony_ci // owned by other objects will still match up here. 18cb93a386Sopenharmony_ci int i = 0; 19cb93a386Sopenharmony_ci for (const auto& uniformInfo : uniforms.items()) { 20cb93a386Sopenharmony_ci Uniform& uniform = fUniforms[i]; 21cb93a386Sopenharmony_ci SkDEBUGCODE( 22cb93a386Sopenharmony_ci uniform.fArrayCount = uniformInfo.fVariable.getArrayCount(); 23cb93a386Sopenharmony_ci uniform.fType = uniformInfo.fVariable.getType(); 24cb93a386Sopenharmony_ci ) 25cb93a386Sopenharmony_ci uniform.fOffset = uniformInfo.fUBOOffset; 26cb93a386Sopenharmony_ci ++i; 27cb93a386Sopenharmony_ci } 28cb93a386Sopenharmony_ci} 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_cistatic wgpu::BindGroupEntry make_bind_group_entry(uint32_t binding, const wgpu::Buffer& buffer, 31cb93a386Sopenharmony_ci uint32_t offset, uint32_t size) { 32cb93a386Sopenharmony_ci wgpu::BindGroupEntry result; 33cb93a386Sopenharmony_ci result.binding = binding; 34cb93a386Sopenharmony_ci result.buffer = buffer; 35cb93a386Sopenharmony_ci result.offset = offset; 36cb93a386Sopenharmony_ci result.size = size; 37cb93a386Sopenharmony_ci result.sampler = nullptr; 38cb93a386Sopenharmony_ci result.textureView = nullptr; 39cb93a386Sopenharmony_ci return result; 40cb93a386Sopenharmony_ci} 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ciwgpu::BindGroup GrDawnProgramDataManager::uploadUniformBuffers(GrDawnGpu* gpu, 43cb93a386Sopenharmony_ci wgpu::BindGroupLayout layout) { 44cb93a386Sopenharmony_ci if (fUniformsDirty && 0 != fUniformSize) { 45cb93a386Sopenharmony_ci std::vector<wgpu::BindGroupEntry> bindings; 46cb93a386Sopenharmony_ci GrDawnRingBuffer::Slice slice; 47cb93a386Sopenharmony_ci slice = gpu->allocateUniformRingBufferSlice(fUniformSize); 48cb93a386Sopenharmony_ci gpu->queue().WriteBuffer(slice.fBuffer, slice.fOffset, fUniformData.get(), fUniformSize); 49cb93a386Sopenharmony_ci bindings.push_back(make_bind_group_entry(GrSPIRVUniformHandler::kUniformBinding, 50cb93a386Sopenharmony_ci slice.fBuffer, slice.fOffset, 51cb93a386Sopenharmony_ci fUniformSize)); 52cb93a386Sopenharmony_ci wgpu::BindGroupDescriptor descriptor; 53cb93a386Sopenharmony_ci descriptor.layout = layout; 54cb93a386Sopenharmony_ci descriptor.entryCount = bindings.size(); 55cb93a386Sopenharmony_ci descriptor.entries = bindings.data(); 56cb93a386Sopenharmony_ci fBindGroup = gpu->device().CreateBindGroup(&descriptor); 57cb93a386Sopenharmony_ci fUniformsDirty = false; 58cb93a386Sopenharmony_ci } 59cb93a386Sopenharmony_ci return fBindGroup; 60cb93a386Sopenharmony_ci} 61