1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2020 Google LLC
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/d3d/GrD3DCommandSignature.h"
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#include "src/gpu/d3d/GrD3DGpu.h"
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_cisk_sp<GrD3DCommandSignature> GrD3DCommandSignature::Make(GrD3DGpu* gpu, ForIndexed forIndexed,
13cb93a386Sopenharmony_ci                                                         unsigned int slot) {
14cb93a386Sopenharmony_ci    bool indexed = (forIndexed == ForIndexed::kYes);
15cb93a386Sopenharmony_ci    D3D12_INDIRECT_ARGUMENT_DESC argumentDesc = {};
16cb93a386Sopenharmony_ci    argumentDesc.Type = indexed ? D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED
17cb93a386Sopenharmony_ci                                : D3D12_INDIRECT_ARGUMENT_TYPE_DRAW;
18cb93a386Sopenharmony_ci    argumentDesc.VertexBuffer.Slot = slot;
19cb93a386Sopenharmony_ci
20cb93a386Sopenharmony_ci    D3D12_COMMAND_SIGNATURE_DESC commandSigDesc = {};
21cb93a386Sopenharmony_ci    commandSigDesc.ByteStride = indexed ? sizeof(D3D12_DRAW_INDEXED_ARGUMENTS)
22cb93a386Sopenharmony_ci                                        : sizeof(D3D12_DRAW_ARGUMENTS);
23cb93a386Sopenharmony_ci    commandSigDesc.NumArgumentDescs = 1;
24cb93a386Sopenharmony_ci    commandSigDesc.pArgumentDescs = &argumentDesc;
25cb93a386Sopenharmony_ci    commandSigDesc.NodeMask = 0;
26cb93a386Sopenharmony_ci
27cb93a386Sopenharmony_ci    gr_cp<ID3D12CommandSignature> commandSig;
28cb93a386Sopenharmony_ci    HRESULT hr = gpu->device()->CreateCommandSignature(&commandSigDesc, nullptr,
29cb93a386Sopenharmony_ci                                                       IID_PPV_ARGS(&commandSig));
30cb93a386Sopenharmony_ci    if (!SUCCEEDED(hr)) {
31cb93a386Sopenharmony_ci        SkDebugf("Failed to create command signature.\n");
32cb93a386Sopenharmony_ci        return nullptr;
33cb93a386Sopenharmony_ci    }
34cb93a386Sopenharmony_ci
35cb93a386Sopenharmony_ci    return sk_sp<GrD3DCommandSignature>(new GrD3DCommandSignature(std::move(commandSig),
36cb93a386Sopenharmony_ci                                                                  forIndexed, slot));
37cb93a386Sopenharmony_ci}
38