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