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 "tools/gpu/d3d/D3DTestUtils.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#ifdef SK_DIRECT3D 11cb93a386Sopenharmony_ci#include <d3d12sdklayers.h> 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#include "include/gpu/d3d/GrD3DBackendContext.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_cinamespace sk_gpu_test { 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_civoid get_hardware_adapter(IDXGIFactory4* pFactory, IDXGIAdapter1** ppAdapter) { 18cb93a386Sopenharmony_ci *ppAdapter = nullptr; 19cb93a386Sopenharmony_ci for (UINT adapterIndex = 0; ; ++adapterIndex) { 20cb93a386Sopenharmony_ci IDXGIAdapter1* pAdapter = nullptr; 21cb93a386Sopenharmony_ci if (DXGI_ERROR_NOT_FOUND == pFactory->EnumAdapters1(adapterIndex, &pAdapter)) { 22cb93a386Sopenharmony_ci // No more adapters to enumerate. 23cb93a386Sopenharmony_ci break; 24cb93a386Sopenharmony_ci } 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci // Check to see if the adapter supports Direct3D 12, but don't create the 27cb93a386Sopenharmony_ci // actual device yet. 28cb93a386Sopenharmony_ci if (SUCCEEDED(D3D12CreateDevice(pAdapter, D3D_FEATURE_LEVEL_11_0, _uuidof(ID3D12Device), 29cb93a386Sopenharmony_ci nullptr))) { 30cb93a386Sopenharmony_ci *ppAdapter = pAdapter; 31cb93a386Sopenharmony_ci return; 32cb93a386Sopenharmony_ci } 33cb93a386Sopenharmony_ci pAdapter->Release(); 34cb93a386Sopenharmony_ci } 35cb93a386Sopenharmony_ci} 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_cibool CreateD3DBackendContext(GrD3DBackendContext* ctx, 38cb93a386Sopenharmony_ci bool isProtected) { 39cb93a386Sopenharmony_ci#if defined(SK_ENABLE_D3D_DEBUG_LAYER) 40cb93a386Sopenharmony_ci // Enable the D3D12 debug layer. 41cb93a386Sopenharmony_ci { 42cb93a386Sopenharmony_ci gr_cp<ID3D12Debug> debugController; 43cb93a386Sopenharmony_ci if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)))) 44cb93a386Sopenharmony_ci { 45cb93a386Sopenharmony_ci debugController->EnableDebugLayer(); 46cb93a386Sopenharmony_ci } 47cb93a386Sopenharmony_ci } 48cb93a386Sopenharmony_ci#endif 49cb93a386Sopenharmony_ci // Create the device 50cb93a386Sopenharmony_ci gr_cp<IDXGIFactory4> factory; 51cb93a386Sopenharmony_ci if (!SUCCEEDED(CreateDXGIFactory1(IID_PPV_ARGS(&factory)))) { 52cb93a386Sopenharmony_ci return false; 53cb93a386Sopenharmony_ci } 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci gr_cp<IDXGIAdapter1> hardwareAdapter; 56cb93a386Sopenharmony_ci get_hardware_adapter(factory.get(), &hardwareAdapter); 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci gr_cp<ID3D12Device> device; 59cb93a386Sopenharmony_ci if (!SUCCEEDED(D3D12CreateDevice(hardwareAdapter.get(), 60cb93a386Sopenharmony_ci D3D_FEATURE_LEVEL_11_0, 61cb93a386Sopenharmony_ci IID_PPV_ARGS(&device)))) { 62cb93a386Sopenharmony_ci return false; 63cb93a386Sopenharmony_ci } 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci // Create the command queue 66cb93a386Sopenharmony_ci gr_cp<ID3D12CommandQueue> queue; 67cb93a386Sopenharmony_ci D3D12_COMMAND_QUEUE_DESC queueDesc = {}; 68cb93a386Sopenharmony_ci queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; 69cb93a386Sopenharmony_ci queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci if (!SUCCEEDED(device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&queue)))) { 72cb93a386Sopenharmony_ci return false; 73cb93a386Sopenharmony_ci } 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci ctx->fAdapter = hardwareAdapter; 76cb93a386Sopenharmony_ci ctx->fDevice = device; 77cb93a386Sopenharmony_ci ctx->fQueue = queue; 78cb93a386Sopenharmony_ci // TODO: set up protected memory 79cb93a386Sopenharmony_ci ctx->fProtectedContext = /*isProtected ? GrProtected::kYes :*/ GrProtected::kNo; 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci return true; 82cb93a386Sopenharmony_ci} 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci} 85cb93a386Sopenharmony_ci 86cb93a386Sopenharmony_ci#endif 87