/// <summary> /// コンスタントバッファ解決 /// </summary> /// <param name="reflection"></param> private void ResolveConstantBuffer(ShaderReflection reflection) { // すべてのコンスタントバッファを名前で辞書化する if (constantBufferObjects_ == null) { constantBufferObjects_ = new List <ConstantBufferObject>(); } var list = reflection.GetConstantBufferNameList(); foreach (var n in list) { int bind_index = 0; if (reflection.FindConstantBufferByName(n, out bind_index)) { if (!constantBufferDictionary_.ContainsKey(n)) { var obj = new ConstantBufferObject(); obj.name_ = n; obj.isSystem_ = false; obj.inst_ = reflection.CreateConstantBufferInstance(n); BufferDescription buffer_desc = new BufferDescription(); buffer_desc.Usage = ResourceUsage.Default; buffer_desc.CpuAccessFlags = CpuAccessFlags.None; buffer_desc.BindFlags = BindFlags.ConstantBuffer; buffer_desc.SizeInBytes = obj.inst_.BufferSize; obj.buffer_ = new D3D11Buffer(GraphicsCore.D3D11Device, buffer_desc); constantBufferDictionary_[n] = obj; } // システムのCBufferか? if (SystemCBufferNameList.Contains(n)) { int index = 0; foreach (string s in SystemCBufferNameList) { if (s == n) { break; } index++; } cbufferBindFlag_ |= 1u << index; constantBufferDictionary_[n].isSystem_ = true; } constantBufferObjects_.Add(constantBufferDictionary_[n]); nativeCBuffers_[bind_index] = constantBufferDictionary_[n].buffer_; if (cbufferNum_ < (bind_index + 1)) { cbufferNum_ = bind_index + 1; } } } }
/// <summary> /// 生成 /// </summary> /// <param name="desc"></param> public ComputeShader(InitDesc desc) { var device = GraphicsCore.D3D11Device; var inc = new ShaderIncludeHandler(System.IO.Path.GetDirectoryName(desc.file_name)); using (var bytecode = ShaderBytecode.CompileFromFile(desc.file_name, desc.main, "cs_5_0", ShaderFlags.None, EffectFlags.None, desc.macro, inc)) { shader_ = new D3DComputeShader(device, bytecode); using (ShaderReflection reflect = new ShaderReflection(bytecode)) { // コンスタントバッファ解決 cbInst_ = reflect.CreateConstantBufferInstance("CB"); // 現状名前固定 if (cbInst_ != null) { BufferDescription buffer_desc = new BufferDescription(); buffer_desc.Usage = ResourceUsage.Default; buffer_desc.CpuAccessFlags = CpuAccessFlags.None; buffer_desc.BindFlags = BindFlags.ConstantBuffer; buffer_desc.SizeInBytes = cbInst_.BufferSize; constantBuffer_ = new D3D11Buffer(GraphicsCore.D3D11Device, buffer_desc); } } } }