void ConstructPlatformDependentMembers(Int64 bufferLocation, H1PixelFormat format, Int32 sizeInBytes)
 {
     m_IBVDesc = new IndexBufferView()
     {
         BufferLocation = bufferLocation,
         Format         = H1RHIDefinitionHelper.ConvertToFormat(format),
         SizeInBytes    = sizeInBytes,
     };
 }
Esempio n. 2
0
        public void SetRenderTargetFormats(H1PixelFormat[] rtvFormats, H1PixelFormat dsvFormat, Int32 msaaCount, Int32 msaaQuality)
        {
            for (Int32 i = 0; i < rtvFormats.Count(); ++i)
            {
                m_GraphicsPipelineStateDesc.RenderTargetFormats[i] = H1RHIDefinitionHelper.ConvertToFormat(rtvFormats[i]);
            }
            for (Int32 i = rtvFormats.Count(); i < m_GraphicsPipelineStateDesc.RenderTargetCount; ++i)
            {
                m_GraphicsPipelineStateDesc.RenderTargetFormats[i] = SharpDX.DXGI.Format.Unknown;
            }

            m_GraphicsPipelineStateDesc.RenderTargetCount         = rtvFormats.Count();
            m_GraphicsPipelineStateDesc.DepthStencilFormat        = H1RHIDefinitionHelper.ConvertToFormat(dsvFormat);
            m_GraphicsPipelineStateDesc.SampleDescription.Count   = msaaCount;
            m_GraphicsPipelineStateDesc.SampleDescription.Quality = msaaQuality;
        }
        public static ResourceDescription ConvertToResourceDescDx12(H1GpuResourceDesc resourceDesc)
        {
            ResourceDescription result = new ResourceDescription();

            result.Dimension = (ResourceDimension)DimensionMapper[Convert.ToInt32(resourceDesc.Dimension)];
            result.Alignment = resourceDesc.Alignment;
            result.Width     = resourceDesc.Width;
            result.Height    = Convert.ToInt32(resourceDesc.Height);
            result.MipLevels = Convert.ToInt16(resourceDesc.MipLevels);
            result.SampleDescription.Count   = Convert.ToInt32(resourceDesc.SampleDesc.Count);
            result.SampleDescription.Quality = Convert.ToInt32(resourceDesc.SampleDesc.Quality);
            result.Format           = H1RHIDefinitionHelper.ConvertToFormat(resourceDesc.Format);
            result.Flags            = (ResourceFlags)ResourceFlagsMapper[Convert.ToInt32(resourceDesc.Flags)];
            result.DepthOrArraySize = Convert.ToInt16(resourceDesc.DepthOrArraySize);

            return(result);
        }
        public virtual Boolean CreateResourceDescription(H1GpuResourceDesc desc)
        {
            // API level specific resource description
            m_Description.Alignment                 = desc.Alignment;
            m_Description.DepthOrArraySize          = Convert.ToInt16(desc.DepthOrArraySize);
            m_Description.Dimension                 = (ResourceDimension)H1GpuResource.DimensionMapper[Convert.ToInt32(desc.Dimension)];
            m_Description.Flags                     = H1RHIDefinitionHelper.FormatToResourceFlags(desc.Flags);
            m_Description.Format                    = H1RHIDefinitionHelper.ConvertToFormat(desc.Format);
            m_Description.Width                     = Convert.ToInt32(desc.Width);
            m_Description.Height                    = Convert.ToInt32(desc.Height);
            m_Description.Layout                    = (TextureLayout)H1GpuResource.TextureLayoutMapper[Convert.ToInt32(desc.Layout)];
            m_Description.MipLevels                 = Convert.ToInt16(desc.MipLevels);
            m_Description.SampleDescription.Count   = Convert.ToInt32(desc.SampleDesc.Count);
            m_Description.SampleDescription.Quality = Convert.ToInt32(desc.SampleDesc.Quality);

            return(true);
        }
Esempio n. 5
0
        public Boolean SetInputLayout(H1InputLayout inputLayout)
        {
            List <InputElement> inputElements = new List <InputElement>();

            foreach (H1InputElementDescription element in inputLayout.InputElements)
            {
                InputElement inputElement = new InputElement();
                inputElement.SemanticName  = element.SemanticName;
                inputElement.SemanticIndex = element.SemanticIndex;
                inputElement.Format        = H1RHIDefinitionHelper.ConvertToFormat(element.Format);
                inputElement.Slot          = element.InputSlot;

                inputElements.Add(inputElement);
            }

            m_GraphicsPipelineStateDesc.InputLayout = new InputLayoutDescription(inputElements.ToArray());

            return(true);
        }
        void CreateInputLayout()
        {
            // @TODO - need to modify input element description from H1VertexStream

            // platform-specific implementation
            List <InputElement> inputElements = new List <InputElement>();

            foreach (var stream in m_InputElements)
            {
                InputElement element = new InputElement();
                element.SemanticName  = stream.SemanticName;
                element.SemanticIndex = stream.SemanticIndex;
                element.Format        = H1RHIDefinitionHelper.ConvertToFormat(stream.Format);

                // watch out - I use multiple vertex buffer instead of big vertex buffer indicating by alignbyteoffset
                element.Slot = stream.InputSlot;
                inputElements.Add(element);
            }

            // create input layout based on the resultant list of input elements
            m_InputLayoutDesc = new InputLayoutDescription(inputElements.ToArray());
        }
        public override Boolean CreateView()
        {
            // the description is in invalid state, please check
            if (!m_bHasDesc)
            {
                return(false);
            }

            // get the device
            Device deviceDX12 = H1Global <H1ManagedRenderer> .Instance.Device;

            // get the descriptor handle
            if (m_DescriptorHandle.Ptr == null)
            {
                m_DescriptorHandle = H1Global <H1ManagedRenderer> .Instance.Gen2Layer.AllocateDescriptor(H1DescriptorHeapType.ConstantBufferView_ShaderResourceView_UnorderedAccessView);
            }

            // convert platform-independent description to platform-dependent description
            m_SRVDesc.Format = H1RHIDefinitionHelper.ConvertToFormat(m_Description.Format);

            m_SRVDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;

            // depending on view dimension types, create the corresponding description
            switch (m_Description.ViewDimension)
            {
            case H1ShaderResourceViewDimension.Buffer:
            {
                m_SRVDesc.Dimension = ShaderResourceViewDimension.Buffer;
                // if the buffer description is not filled up, invalid description
                if (m_Description.Buffer == null)
                {
                    return(false);
                }

                m_SRVDesc.Buffer.FirstElement        = m_Description.Buffer.FirstElement;
                m_SRVDesc.Buffer.ElementCount        = m_Description.Buffer.NumElement;
                m_SRVDesc.Buffer.StructureByteStride = m_Description.Buffer.StructuredByteStride;

                switch (m_Description.Buffer.Flags)
                {
                case H1BufferShaderResourceViewFlags.None:
                    m_SRVDesc.Buffer.Flags = BufferShaderResourceViewFlags.None;
                    break;

                case H1BufferShaderResourceViewFlags.Raw:
                    m_SRVDesc.Buffer.Flags = BufferShaderResourceViewFlags.Raw;
                    break;
                }

                break;
            }

            case H1ShaderResourceViewDimension.Texture1D:
            {
                m_SRVDesc.Dimension = ShaderResourceViewDimension.Texture1D;
                if (m_Description.Texture1D == null)
                {
                    return(false);
                }

                m_SRVDesc.Texture1D.MostDetailedMip     = m_Description.Texture1D.MostDetailedMip;
                m_SRVDesc.Texture1D.MipLevels           = m_Description.Texture1D.MipLevels;
                m_SRVDesc.Texture1D.ResourceMinLODClamp = m_Description.Texture1D.ResourceMinLODClamp;

                break;
            }

            case H1ShaderResourceViewDimension.Texture1DArray:
            {
                m_SRVDesc.Dimension = ShaderResourceViewDimension.Texture1DArray;
                if (m_Description.Texture1DArray == null)
                {
                    return(false);
                }

                m_SRVDesc.Texture1DArray.MostDetailedMip     = m_Description.Texture1DArray.MostDetailedMip;
                m_SRVDesc.Texture1DArray.MipLevels           = m_Description.Texture1DArray.MipLevels;
                m_SRVDesc.Texture1DArray.FirstArraySlice     = m_Description.Texture1DArray.FirstArraySlice;
                m_SRVDesc.Texture1DArray.ArraySize           = m_Description.Texture1DArray.ArraySize;
                m_SRVDesc.Texture1DArray.ResourceMinLODClamp = m_Description.Texture1DArray.ResourceMinLODClamp;

                break;
            }

            case H1ShaderResourceViewDimension.Texture2D:
            {
                m_SRVDesc.Dimension = ShaderResourceViewDimension.Texture2D;
                if (m_Description.Texture2D == null)
                {
                    return(false);
                }

                m_SRVDesc.Texture2D.MostDetailedMip     = m_Description.Texture2D.MostDetailedMip;
                m_SRVDesc.Texture2D.MipLevels           = m_Description.Texture2D.MipLevels;
                m_SRVDesc.Texture2D.PlaneSlice          = m_Description.Texture2D.PlaneSlice;
                m_SRVDesc.Texture2D.ResourceMinLODClamp = m_Description.Texture2D.ResourceMinLODClamp;

                break;
            }

            case H1ShaderResourceViewDimension.Texture2DArray:
            {
                m_SRVDesc.Dimension = ShaderResourceViewDimension.Texture2DArray;
                if (m_Description.Texture2DArray == null)
                {
                    return(false);
                }

                m_SRVDesc.Texture2DArray.MostDetailedMip     = m_Description.Texture2DArray.MostDetailedMip;
                m_SRVDesc.Texture2DArray.MipLevels           = m_Description.Texture2DArray.MipLevels;
                m_SRVDesc.Texture2DArray.PlaneSlice          = m_Description.Texture2DArray.PlaneSlice;
                m_SRVDesc.Texture2DArray.ResourceMinLODClamp = m_Description.Texture2DArray.ResourceMinLODClamp;
                m_SRVDesc.Texture2DArray.FirstArraySlice     = m_Description.Texture2DArray.FirstArraySlice;
                m_SRVDesc.Texture2DArray.ArraySize           = m_Description.Texture2DArray.ArraySize;

                break;
            }

            case H1ShaderResourceViewDimension.Texture3D:
            {
                m_SRVDesc.Dimension = ShaderResourceViewDimension.Texture3D;
                if (m_Description.Texture3D == null)
                {
                    return(false);
                }

                m_SRVDesc.Texture3D.MostDetailedMip     = m_Description.Texture3D.MostDetailedMip;
                m_SRVDesc.Texture3D.MipLevels           = m_Description.Texture3D.MipLevels;
                m_SRVDesc.Texture3D.ResourceMinLODClamp = m_Description.Texture3D.ResourceMinLODClamp;

                break;
            }

            default:
                // @TODO - not implemented yet!
                return(false);
            }

            // create view descriptor
            deviceDX12.CreateShaderResourceView(m_ResourceRef.GpuResource, m_SRVDesc, m_DescriptorHandle);

            return(true);
        }
        public override Boolean CreateView()
        {
            // the description is in invalid state, please check
            if (!m_bHasDesc)
            {
                return(false);
            }

            // get the device
            Device deviceDX12 = H1Global <H1ManagedRenderer> .Instance.Device;

            // get the descriptor handle
            if (m_DescriptorHandle.Ptr == null)
            {
                m_DescriptorHandle = H1Global <H1ManagedRenderer> .Instance.Gen2Layer.AllocateDescriptor(H1DescriptorHeapType.ConstantBufferView_ShaderResourceView_UnorderedAccessView);
            }

            // convert platform-independent description to platform-dependent description
            m_RTVDesc.Format = H1RHIDefinitionHelper.ConvertToFormat(m_Description.Format);

            // depending on view dimension types, create the corresponding description
            switch (m_Description.ViewDimension)
            {
            case H1RenderTargetViewDimension.Buffer:
            {
                m_RTVDesc.Dimension = RenderTargetViewDimension.Buffer;
                // if the buffer description is not filled up, invalid description
                if (m_Description.Buffer == null)
                {
                    return(false);
                }

                m_RTVDesc.Buffer.FirstElement = m_Description.Buffer.FirstElement;
                m_RTVDesc.Buffer.ElementCount = m_Description.Buffer.NumElements;

                break;
            }

            case H1RenderTargetViewDimension.Texture1D:
            {
                m_RTVDesc.Dimension = RenderTargetViewDimension.Texture1D;
                if (m_Description.Texture1D == null)
                {
                    return(false);
                }

                m_RTVDesc.Texture1D.MipSlice = m_Description.Texture1D.MipSlice;

                break;
            }

            case H1RenderTargetViewDimension.Texture1DArray:
            {
                m_RTVDesc.Dimension = RenderTargetViewDimension.Texture1DArray;
                if (m_Description.Texture1DArray == null)
                {
                    return(false);
                }

                m_RTVDesc.Texture1DArray.MipSlice        = m_Description.Texture1DArray.MipSlice;
                m_RTVDesc.Texture1DArray.FirstArraySlice = m_Description.Texture1DArray.FirstArraySlice;
                m_RTVDesc.Texture1DArray.ArraySize       = m_Description.Texture1DArray.ArraySize;

                break;
            }

            case H1RenderTargetViewDimension.Texture2D:
            {
                m_RTVDesc.Dimension = RenderTargetViewDimension.Texture2D;
                if (m_Description.Texture2D == null)
                {
                    return(false);
                }

                m_RTVDesc.Texture2D.MipSlice   = m_Description.Texture2D.MipSlice;
                m_RTVDesc.Texture2D.PlaneSlice = m_Description.Texture2D.PlaneSlice;

                break;
            }

            case H1RenderTargetViewDimension.Texture2DArray:
            {
                m_RTVDesc.Dimension = RenderTargetViewDimension.Texture2DArray;
                if (m_Description.Texture2DArray == null)
                {
                    return(false);
                }

                m_RTVDesc.Texture2DArray.MipSlice        = m_Description.Texture2DArray.MipSlice;
                m_RTVDesc.Texture2DArray.PlaneSlice      = m_Description.Texture2DArray.PlaneSlice;
                m_RTVDesc.Texture2DArray.FirstArraySlice = m_Description.Texture2DArray.FirstArraySlice;
                m_RTVDesc.Texture2DArray.ArraySize       = m_Description.Texture2DArray.ArraySize;

                break;
            }

            case H1RenderTargetViewDimension.Texture3D:
            {
                m_RTVDesc.Dimension = RenderTargetViewDimension.Texture3D;
                if (m_Description.Texture3D == null)
                {
                    return(false);
                }

                m_RTVDesc.Texture3D.MipSlice        = m_Description.Texture3D.MipSlice;
                m_RTVDesc.Texture3D.FirstDepthSlice = m_Description.Texture3D.FirstWSlice;
                m_RTVDesc.Texture3D.DepthSliceCount = m_Description.Texture3D.WSize;

                break;
            }

            default:
                // @TODO - not implemented yet!
                return(false);
            }

            // create view descriptor
            deviceDX12.CreateRenderTargetView(m_ResourceRef.GpuResource, m_RTVDesc, m_DescriptorHandle);

            return(true);
        }
        public static H1DX12Texture2D Create(Device device, Vector4 clearValue, H1Texture2D.Description desc, H1SubresourceData[] initialData)
        {
            // converting description to DX12 description
            ResourceDescription desc12 = new ResourceDescription
            {
                Format           = H1RHIDefinitionHelper.ConvertToFormat(desc.Format),
                Width            = Convert.ToInt32(desc.Width),
                Height           = Convert.ToInt32(desc.Height),
                DepthOrArraySize = Convert.ToInt16(desc.ArraySize),
                MipLevels        = Convert.ToInt16(desc.MipLevels),
                Flags            = ResourceFlags.None,
                Layout           = TextureLayout.Unknown,
                Dimension        = ResourceDimension.Texture2D,
            };

            desc12.SampleDescription.Count   = Convert.ToInt32(desc.SampleDesc.Count);
            desc12.SampleDescription.Quality = Convert.ToInt32(desc.SampleDesc.Quality);

            HeapProperties heapProperties  = new HeapProperties(HeapType.Default);
            ResourceStates resourceUsage   = ResourceStates.CopyDestination;
            ClearValue     value           = H1GlobalDX12Definitions.GetDXGIFormatClearValue(desc12.Format, (desc.BindFlags & Convert.ToUInt32(H1BindFlag.DepthStencil)) != 0);
            Boolean        allowClearValue = desc12.Dimension == ResourceDimension.Buffer;

            if (desc.Usage == H1Usage.Immutable)
            {
                heapProperties = new HeapProperties(HeapType.Default);
                resourceUsage  = ResourceStates.CopyDestination;
            }

            else if (desc.Usage == H1Usage.Staging)
            {
                heapProperties = new HeapProperties(HeapType.Readback);
                resourceUsage  = ResourceStates.CopyDestination;
            }

            else if (desc.Usage == H1Usage.Dynamic)
            {
                heapProperties = new HeapProperties(HeapType.Upload);
                resourceUsage  = ResourceStates.GenericRead;
            }

            if (desc.CPUAccessFlags != 0)
            {
                if (desc.CPUAccessFlags == Convert.ToUInt32(H1CPUAccessFlag.Write))
                {
                    heapProperties = new HeapProperties(HeapType.Upload);
                    resourceUsage  = ResourceStates.GenericRead;
                }

                else if (desc.CPUAccessFlags == Convert.ToUInt32(H1CPUAccessFlag.Read))
                {
                    heapProperties = new HeapProperties(HeapType.Readback);
                    resourceUsage  = ResourceStates.CopyDestination;
                }

                else
                {
                    return(null);
                }
            }

            if (clearValue != null)
            {
                if ((desc.BindFlags & Convert.ToUInt32(H1BindFlag.DepthStencil)) != 0)
                {
                    value.DepthStencil.Depth   = clearValue.X;
                    value.DepthStencil.Stencil = Convert.ToByte(clearValue.Y);
                }
                else
                {
                    value.Color = clearValue;
                }
            }

            if ((desc.BindFlags & Convert.ToUInt32(H1BindFlag.UnorderedAccess)) != 0)
            {
                desc12.Flags |= ResourceFlags.AllowUnorderedAccess;
                resourceUsage = ResourceStates.UnorderedAccess;
            }

            if ((desc.BindFlags & Convert.ToUInt32(H1BindFlag.DepthStencil)) != 0)
            {
                desc12.Flags   |= ResourceFlags.AllowDepthStencil;
                allowClearValue = true;
                resourceUsage   = ResourceStates.DepthWrite;
            }

            if ((desc.BindFlags & Convert.ToUInt32(H1BindFlag.RenderTarget)) != 0)
            {
                desc12.Flags   |= ResourceFlags.AllowRenderTarget;
                allowClearValue = true;
                resourceUsage   = ResourceStates.RenderTarget;
            }

            Resource resource = device.CreateCommittedResource(
                heapProperties,
                HeapFlags.None,
                desc12,
                resourceUsage,
                allowClearValue ? value : default(ClearValue?));

            H1DX12Texture2D newTexture = new H1DX12Texture2D();

            newTexture.m_Resource = new H1DX12Resource(resource, resourceUsage, resource.Description, initialData, Convert.ToUInt32(desc12.DepthOrArraySize * desc12.MipLevels));
            return(newTexture);
        }