Example #1
0
        /// <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;
                    }
                }
            }
        }
Example #2
0
        /// <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);
                    }
                }
            }
        }