// static method for more general creat page for texture resided in GPU memory
        protected virtual Boolean CreatePage(H1PixelFormat format, Int32 width, Int32 height, Int32 depthOrArraySize, H1OptionalParametersForTexture options = null)
        {
            // invalid call for create page
            if (Owner.PageType != H1GpuMemoryPageType.Normal)
            {
                return(false);
            }

            // create resource encapsulated GPU API layer
            H1HeapType       heapType = H1HeapType.Unknown;
            H1ResourceStates usage    = H1ResourceStates.Invalid;

            if (Owner.Type != H1GpuMemoryType.GpuWritable)
            {
                // invalid gpu memory type
                // CpuWritable type should be H1GpuMemoryPageSegmented type
                return(false);
            }

            // GPU-writable
            heapType = H1HeapType.Default;
            H1GpuResourceDesc resourceDesc = new H1GpuResourceDesc();

            resourceDesc.Alignment        = 0; // depends on GDI decision for choosing appropriate alignment
            resourceDesc.Width            = Convert.ToUInt32(width);
            resourceDesc.Height           = Convert.ToUInt32(height);
            resourceDesc.DepthOrArraySize = Convert.ToUInt16(depthOrArraySize);
            resourceDesc.Format           = format;

            // these description properties are default values
            resourceDesc.SampleDesc.Count   = 1;
            resourceDesc.SampleDesc.Quality = 0;
            resourceDesc.Layout             = H1TextureLayout.RowMajor;
            resourceDesc.MipLevels          = 1;

            // apply optional parameters
            if (options != null)
            {
                resourceDesc.Flags = options.ResourceFlags;
                usage = options.ResourceStates;

                // resource description optional parameters
                resourceDesc.MipLevels = options.MipLevels;
                resourceDesc.Layout    = options.Layout;

                // struct copy (shallow copy should be occurred)
                resourceDesc.SampleDesc = options.SampleDesc;
            }

            // create new page resource
            //if (!Resource.CreateResource(heapType, resourceDesc, usage))
            {
                return(false);
            }

            //return true;
        }
        // generic version for page creation
        protected virtual Boolean CreatePage(Int64 sizeInBytes, H1OptionalParameters options = null)
        {
            // invalid call for create page
            if (Owner.PageType != H1GpuMemoryPageType.Normal)
            {
                return(false);
            }

            // create resource encapsulated GPU API layer
            H1HeapType       heapType = H1HeapType.Unknown;
            H1ResourceStates usage    = H1ResourceStates.Invalid;

            H1GpuResourceDesc resourceDesc = new H1GpuResourceDesc();

            resourceDesc.Alignment          = 0; // depends on GDI decision for choosing appropriate alignment
            resourceDesc.Height             = 1;
            resourceDesc.DepthOrArraySize   = 1;
            resourceDesc.MipLevels          = 1;
            resourceDesc.Format             = H1PixelFormat.Unknown;
            resourceDesc.SampleDesc.Count   = 1;
            resourceDesc.SampleDesc.Quality = 0;
            resourceDesc.Layout             = H1TextureLayout.RowMajor;

            if (Owner.Type != H1GpuMemoryType.GpuWritable)
            {
                // invalid gpu memory type
                // CpuWritable type should be H1GpuMemoryPageSegmented type
                return(false);
            }

            // GPU-writable
            heapType           = H1HeapType.Default;
            resourceDesc.Width = Convert.ToUInt32(sizeInBytes);

            // apply optional parameters
            if (options != null)
            {
                resourceDesc.Flags = options.ResourceFlags;
                usage = options.ResourceStates;
            }

            // create new page resource
            //if (!Resource.CreateResource(heapType, resourceDesc, usage))
            {
                return(false);
            }

            //return true;
        }
        static void CreatePlatformDependent(Vector4 clearValue, H1Texture2D.Description desc, H1SubresourceData initialData, ref H1GpuTexture2D result)
        {
            // get device for directX 12
            Device deviceDX12 = H1Global <H1ManagedRenderer> .Instance.Device;

            H1GpuResourceDesc desc12         = H1RHIDefinitionHelper.Texture2DDescToGpuResourceDesc(desc);
            H1HeapType        heapType       = H1RHIDefinitionHelper.GetHeapTypeFromTexture2DDesc(desc);
            H1ResourceStates  resourceStates = H1RHIDefinitionHelper.GetResourceStatesFromTexture2DDesc(desc);

            // generate resource
            //if (result != null)
            //    result.Resource.CreateResource(heapType, desc12, resourceStates);

            // generate RHI resource description (need resource description for generating UAV or SRV or etc.)
            result.CreateResourceDescription(desc12);
        }
        public static H1ResourceStates GetResourceStatesFromTexture2DDesc(H1Texture2D.Description desc)
        {
            H1ResourceStates result = H1ResourceStates.CopyDestination;

            if (desc.Usage == H1Usage.Dynamic)
            {
                result = H1ResourceStates.GenericRead;
            }

            if (desc.CPUAccessFlags != 0)
            {
                if (desc.CPUAccessFlags == Convert.ToUInt32(H1CPUAccessFlag.Write))
                {
                    result = H1ResourceStates.GenericRead;
                }

                if (desc.CPUAccessFlags == Convert.ToUInt32(H1CPUAccessFlag.Write))
                {
                    result = H1ResourceStates.CopyDestination;
                }

                else
                {
                    return(H1ResourceStates.Invalid);
                }
            }

            // setting resource flag
            if ((desc.BindFlags & Convert.ToUInt32(H1BindFlag.UnorderedAccess)) != 0)
            {
                result = H1ResourceStates.UnorderedAccess;
            }

            if ((desc.BindFlags & Convert.ToUInt32(H1BindFlag.DepthStencil)) != 0)
            {
                result = H1ResourceStates.DepthWrite;
            }

            if ((desc.BindFlags & Convert.ToUInt32(H1BindFlag.RenderTarget)) != 0)
            {
                result = H1ResourceStates.RenderTarget;
            }

            return(result);
        }
示例#5
0
        public H1GpuResourceSegmented CreatePlacedResourceSegmented(H1GpuResourceDesc resourceDesc, H1ResourceStates defaultUsage)
        {
            H1GpuHeapResourceInfo newResSingle = CreatePlacedResourceSegmentedPlatformDependent(resourceDesc, defaultUsage);

            m_ResourceSegmenteds.Add(newResSingle);

            return(newResSingle.Resource as H1GpuResourceSegmented);
        }
        // newly override method called 'CreatePage(...)'
        public new static H1GpuMemoryPageSegmented CreatePage(H1GpuMemoryChunk memoryChunk)
        {
            H1GpuMemoryPageSegmented newPage = new H1GpuMemoryPageSegmented(memoryChunk);

            // create resource encapsulated GPU API layer
            H1HeapType       heapType = H1HeapType.Unknown;
            H1ResourceStates usage    = H1ResourceStates.Invalid;

            H1GpuResourceDesc resourceDesc = new H1GpuResourceDesc();

            resourceDesc.Alignment          = 0;
            resourceDesc.Height             = 1;
            resourceDesc.DepthOrArraySize   = 1;
            resourceDesc.MipLevels          = 1;
            resourceDesc.Format             = H1PixelFormat.Unknown;
            resourceDesc.SampleDesc.Count   = 1;
            resourceDesc.SampleDesc.Quality = 0;
            resourceDesc.Layout             = H1TextureLayout.RowMajor;

            // CPU-writable
            if (newPage.Owner.Type == H1GpuMemoryType.GpuWritable)
            {
                heapType = H1HeapType.Default;

                resourceDesc.Width = Convert.ToUInt32(H1GpuMemoryPageSize.GpuWritablePageSize);
                resourceDesc.Flags = H1ResourceFlags.AllowUnorderedAccess;
                resourceDesc.Flags = H1ResourceFlags.Unknown;

                usage = H1ResourceStates.UnorderedAccess;
            }

            // GPU-writable
            else if (newPage.Owner.Type == H1GpuMemoryType.CpuWritable)
            {
                // cpu writable is mainly for upload page (it could be 'readback' property)
                heapType = H1HeapType.Upload;

                resourceDesc.Width = Convert.ToUInt32(H1GpuMemoryPageSize.CpuWritablePageSize);
                resourceDesc.Flags = H1ResourceFlags.Unknown;

                usage = H1ResourceStates.GenericRead;
            }

            // @TODO - handle 'Readback' heap type
            else
            {
                // invalid type is assigned!
                return(null);
            }

            // create new page resource
            //if (!newPage.Resource.CreateResource(heapType, resourceDesc, usage))
            {
                return(null);
            }

            // initialize the properties of the gpu memory page
            Int32 segmentCounts = -1;

            // calculate segment counts
            // @TODO - need to consider further for choosing segment counts (kinda magic number)
            if (newPage.Owner.Type == H1GpuMemoryType.GpuWritable)
            {
                segmentCounts = 1 << 8; // 256 segments
                newPage.m_PageSegmentCounts = segmentCounts;
                newPage.m_PageSegmentSize   = Convert.ToInt32(H1GpuMemoryPageSize.GpuWritablePageSize) / newPage.m_PageSegmentCounts;
            }

            else if (newPage.Owner.Type == H1GpuMemoryType.CpuWritable)
            {
                segmentCounts = 1 << 10; // 1024 segments
                newPage.m_PageSegmentCounts = segmentCounts;
                newPage.m_PageSegmentSize   = Convert.ToInt32(H1GpuMemoryPageSize.CpuWritablePageSize) / newPage.m_PageSegmentCounts;
            }

            if (!SetupPageSegments(newPage, segmentCounts))
            {
                return(null);
            }

            return(newPage);
        }
        Int32 CreateResourcePlatformDependent(H1HeapType heapType, H1GpuResourceDesc resourceDesc, H1ResourceStates defaultUsage)
        {
            HeapProperties heapProps = new HeapProperties();

            heapProps.CPUPageProperty      = CpuPageProperty.Unknown;
            heapProps.MemoryPoolPreference = MemoryPool.Unknown;
            heapProps.CreationNodeMask     = 1;
            heapProps.VisibleNodeMask      = 1;

            // convert to H1HeapType to HeapType for dx12
            switch (heapType)
            {
            case H1HeapType.Default:
                heapProps.Type = HeapType.Default;
                break;

            case H1HeapType.Readback:
                heapProps.Type = HeapType.Readback;
                break;

            case H1HeapType.Upload:
                heapProps.Type = HeapType.Upload;
                break;
            }

            // convert H1ResourceDesc to ResourceDesc for dx12
            ResourceDescription resourceDescDX12 = ConvertToResourceDescDx12(resourceDesc);
            ResourceStates      defaultStates    = (ResourceStates)ResourceStateMapper[Convert.ToInt32(defaultUsage)];

            Device deviceDX11 = H1Global <H1ManagedRenderer> .Instance.Device;

            m_GpuResource = deviceDX11.CreateCommittedResource(heapProps, HeapFlags.None, resourceDescDX12, defaultStates);

            Int32 elementSize = Convert.ToInt32(H1RHIDefinitionHelper.ElementTypeToSize(resourceDesc.Format));

            if (elementSize == 0)
            {
                throw new InvalidOperationException("there is no appropriate format is implemented in ElementTypeToSize()!");
            }

            Int32 totalSizeInBytes = elementSize * Convert.ToInt32(resourceDesc.Width * resourceDesc.Height * resourceDesc.DepthOrArraySize);

            return(totalSizeInBytes);
        }
        H1GpuHeapResourceInfo CreatePlacedResourceSinglePlatformDependent(H1GpuResourceDesc resourceDesc, H1ResourceStates defaultUsage)
        {
            // get device ptr from the renderer
            Device deviceDX12 = H1Global <H1ManagedRenderer> .Instance.Device;

            H1GpuResourceSingle newRes = H1GpuResourceSingle.CreateEmptyGpuResource();

            // convert H1ResourceDesc to ResourceDesc for dx12
            ResourceDescription resourceDescDX12 = H1GpuResource.ConvertToResourceDescDx12(resourceDesc);
            ResourceStates      defaultStates    = (ResourceStates)H1GpuResource.ResourceStateMapper[Convert.ToInt32(defaultUsage)];

            // get resource allocation info and find proper resource size and alignments
            ResourceAllocationInformation allocInfo = deviceDX12.GetResourceAllocationInfo(0, resourceDescDX12);
            Int64 sizeInBytes = allocInfo.SizeInBytes;
            Int64 alignment   = allocInfo.Alignment;

            if (alignment > 512)
            {
                throw new InvalidOperationException("alignment is bigger than 512 bytes, please check!");
            }

            // request number of segments to resource alloc policy (segments)
            H1GpuResAllocRange newRange = m_HeapResAllocPolicy.Allocate(sizeInBytes);

            if (newRange == null) // there is no current available blocks to allocate
            {
                return(null);
            }

            // with new range,
            Int64    offsetInBytes = newRange.StartOffset * H1GpuResAllocPolicySegmented.DefaultSegmentSizeForHeap;
            Resource newResDX12    = deviceDX12.CreatePlacedResource(m_HeapInstance, offsetInBytes, resourceDescDX12, defaultStates);

            if (newResDX12 == null) // failed to create placed resource
            {
                return(null);
            }

            // set GpuResource for newly created placed resource
            newRes.SetPlacedResourcePlatformDependent(newResDX12);

            // create heap resource info
            H1GpuHeapResourceInfo newResourceInfo = new H1GpuHeapResourceInfo()
            {
                Resource           = newRes,
                ResourceAllocRange = newRange
            };

            return(newResourceInfo);
        }
 H1GpuHeapResourceInfo CreatePlacedResourceSegmentedPlatformDependent(H1GpuResourceDesc resourceDesc, H1ResourceStates defaultUsage)
 {
     // @TODO - need to implemented
     throw new NotImplementedException();
 }
示例#10
0
        protected Boolean CreateResource(H1HeapType heapType, H1GpuResourceDesc resourceDesc, H1ResourceStates defaultUsage)
        {
            Int32 totalSizeInBytes = CreateResourcePlatformDependent(heapType, resourceDesc, defaultUsage);

            if (m_GpuResource == null)
            {
                return(false);
            }

            // based on created platform dependent resource information, create alloc policy
            RegisterAllocPolicy(totalSizeInBytes);

            return(true);
        }
示例#11
0
        public static H1GpuResourceSegmented CreateGpuResource(H1HeapType heapType, H1GpuResourceDesc resourceDesc, H1ResourceStates defaultUsage)
        {
            H1GpuResourceSegmented newRes = new H1GpuResourceSegmented();

            if (!newRes.CreateResource(heapType, resourceDesc, defaultUsage))
            {
                newRes = null;
            }
            return(newRes);
        }
示例#12
0
        public static H1GpuResourceSingle CreateGpuResource(H1HeapType heapType, H1GpuResourceDesc resourceDesc, H1ResourceStates defaultUsage)
        {
            H1GpuResourceSingle newRes = new H1GpuResourceSingle();

            if (!newRes.CreateResource(heapType, resourceDesc, defaultUsage))
            {
                newRes = null; // nullify newly created resource
            }
            return(newRes);
        }