Path: blob/master/drivers/d3d12/rendering_shader_container_d3d12.h
9973 views
/**************************************************************************/1/* rendering_shader_container_d3d12.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "servers/rendering/rendering_shader_container.h"3334#define NIR_ENABLED 13536#ifdef SHADER_BAKER_RUNTIME_ENABLED37#undef NIR_ENABLED38#endif3940#include "d3d12_godot_nir_bridge.h"4142#define D3D12_BITCODE_OFFSETS_NUM_STAGES 34344#if NIR_ENABLED45struct nir_shader;46struct nir_shader_compiler_options;47#endif4849enum RootSignatureLocationType {50RS_LOC_TYPE_RESOURCE,51RS_LOC_TYPE_SAMPLER,52};5354enum ResourceClass {55RES_CLASS_INVALID,56RES_CLASS_CBV,57RES_CLASS_SRV,58RES_CLASS_UAV,59};6061struct RenderingDXIL {62static uint32_t patch_specialization_constant(63RenderingDeviceCommons::PipelineSpecializationConstantType p_type,64const void *p_value,65const uint64_t (&p_stages_bit_offsets)[D3D12_BITCODE_OFFSETS_NUM_STAGES],66HashMap<RenderingDeviceCommons::ShaderStage, Vector<uint8_t>> &r_stages_bytecodes,67bool p_is_first_patch);6869static void sign_bytecode(RenderingDeviceCommons::ShaderStage p_stage, Vector<uint8_t> &r_dxil_blob);70};7172class RenderingShaderContainerD3D12 : public RenderingShaderContainer {73GDSOFTCLASS(RenderingShaderContainerD3D12, RenderingShaderContainer);7475public:76static constexpr uint32_t REQUIRED_SHADER_MODEL = 0x62; // D3D_SHADER_MODEL_6_277static constexpr uint32_t ROOT_CONSTANT_REGISTER = GODOT_NIR_DESCRIPTOR_SET_MULTIPLIER * (RenderingDeviceCommons::MAX_UNIFORM_SETS + 1);78static constexpr uint32_t RUNTIME_DATA_REGISTER = GODOT_NIR_DESCRIPTOR_SET_MULTIPLIER * (RenderingDeviceCommons::MAX_UNIFORM_SETS + 2);79static constexpr uint32_t FORMAT_VERSION = 1;80static constexpr uint32_t SHADER_STAGES_BIT_OFFSET_INDICES[RenderingDeviceCommons::SHADER_STAGE_MAX] = {810, // SHADER_STAGE_VERTEX821, // SHADER_STAGE_FRAGMENT83UINT32_MAX, // SHADER_STAGE_TESSELATION_CONTROL84UINT32_MAX, // SHADER_STAGE_TESSELATION_EVALUATION852, // SHADER_STAGE_COMPUTE86};8788struct RootSignatureLocation {89uint32_t root_param_index = UINT32_MAX;90uint32_t range_index = UINT32_MAX;91};9293struct ReflectionBindingDataD3D12 {94uint32_t resource_class = 0;95uint32_t has_sampler = 0;96uint32_t dxil_stages = 0;97RootSignatureLocation root_signature_locations[2];98};99100struct ReflectionSpecializationDataD3D12 {101uint64_t stages_bit_offsets[D3D12_BITCODE_OFFSETS_NUM_STAGES] = {};102};103104protected:105struct ReflectionDataD3D12 {106uint32_t spirv_specialization_constants_ids_mask = 0;107uint32_t dxil_push_constant_stages = 0;108uint32_t nir_runtime_data_root_param_idx = 0;109};110111struct ContainerFooterD3D12 {112uint32_t root_signature_length = 0;113uint32_t root_signature_crc = 0;114};115116void *lib_d3d12 = nullptr;117ReflectionDataD3D12 reflection_data_d3d12;118Vector<ReflectionBindingDataD3D12> reflection_binding_set_uniforms_data_d3d12;119Vector<ReflectionSpecializationDataD3D12> reflection_specialization_data_d3d12;120Vector<uint8_t> root_signature_bytes;121uint32_t root_signature_crc = 0;122123#if NIR_ENABLED124bool _convert_spirv_to_nir(const Vector<RenderingDeviceCommons::ShaderStageSPIRVData> &p_spirv, const nir_shader_compiler_options *p_compiler_options, HashMap<int, nir_shader *> &r_stages_nir_shaders, Vector<RenderingDeviceCommons::ShaderStage> &r_stages, BitField<RenderingDeviceCommons::ShaderStage> &r_stages_processed);125bool _convert_nir_to_dxil(const HashMap<int, nir_shader *> &p_stages_nir_shaders, BitField<RenderingDeviceCommons::ShaderStage> p_stages_processed, HashMap<RenderingDeviceCommons::ShaderStage, Vector<uint8_t>> &r_dxil_blobs);126bool _convert_spirv_to_dxil(const Vector<RenderingDeviceCommons::ShaderStageSPIRVData> &p_spirv, HashMap<RenderingDeviceCommons::ShaderStage, Vector<uint8_t>> &r_dxil_blobs, Vector<RenderingDeviceCommons::ShaderStage> &r_stages, BitField<RenderingDeviceCommons::ShaderStage> &r_stages_processed);127bool _generate_root_signature(BitField<RenderingDeviceCommons::ShaderStage> p_stages_processed);128129// GodotNirCallbacks.130static void _nir_report_resource(uint32_t p_register, uint32_t p_space, uint32_t p_dxil_type, void *p_data);131static void _nir_report_sc_bit_offset(uint32_t p_sc_id, uint64_t p_bit_offset, void *p_data);132static void _nir_report_bitcode_bit_offset(uint64_t p_bit_offset, void *p_data);133#endif134135// RenderingShaderContainer overrides.136virtual uint32_t _format() const override;137virtual uint32_t _format_version() const override;138virtual uint32_t _from_bytes_reflection_extra_data(const uint8_t *p_bytes) override;139virtual uint32_t _from_bytes_reflection_binding_uniform_extra_data_start(const uint8_t *p_bytes) override;140virtual uint32_t _from_bytes_reflection_binding_uniform_extra_data(const uint8_t *p_bytes, uint32_t p_index) override;141virtual uint32_t _from_bytes_reflection_specialization_extra_data_start(const uint8_t *p_bytes) override;142virtual uint32_t _from_bytes_reflection_specialization_extra_data(const uint8_t *p_bytes, uint32_t p_index) override;143virtual uint32_t _from_bytes_footer_extra_data(const uint8_t *p_bytes) override;144virtual uint32_t _to_bytes_reflection_extra_data(uint8_t *p_bytes) const override;145virtual uint32_t _to_bytes_reflection_binding_uniform_extra_data(uint8_t *p_bytes, uint32_t p_index) const override;146virtual uint32_t _to_bytes_reflection_specialization_extra_data(uint8_t *p_bytes, uint32_t p_index) const override;147virtual uint32_t _to_bytes_footer_extra_data(uint8_t *p_bytes) const override;148virtual void _set_from_shader_reflection_post(const String &p_shader_name, const RenderingDeviceCommons::ShaderReflection &p_reflection) override;149virtual bool _set_code_from_spirv(const Vector<RenderingDeviceCommons::ShaderStageSPIRVData> &p_spirv) override;150151public:152struct ShaderReflectionD3D12 {153uint32_t spirv_specialization_constants_ids_mask = 0;154uint32_t dxil_push_constant_stages = 0;155uint32_t nir_runtime_data_root_param_idx = 0;156Vector<Vector<ReflectionBindingDataD3D12>> reflection_binding_set_uniforms_d3d12;157Vector<ReflectionSpecializationDataD3D12> reflection_specialization_data_d3d12;158Vector<uint8_t> root_signature_bytes;159uint32_t root_signature_crc = 0;160};161162RenderingShaderContainerD3D12();163RenderingShaderContainerD3D12(void *p_lib_d3d12);164ShaderReflectionD3D12 get_shader_reflection_d3d12() const;165};166167class RenderingShaderContainerFormatD3D12 : public RenderingShaderContainerFormat {168protected:169void *lib_d3d12 = nullptr;170171public:172void set_lib_d3d12(void *p_lib_d3d12);173virtual Ref<RenderingShaderContainer> create_container() const override;174virtual ShaderLanguageVersion get_shader_language_version() const override;175virtual ShaderSpirvVersion get_shader_spirv_version() const override;176RenderingShaderContainerFormatD3D12();177virtual ~RenderingShaderContainerFormatD3D12();178};179180181