// // Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved. // #ifndef GPURESOURCE_HPP_ #define GPURESOURCE_HPP_ #include "platform/command.hpp" #include "platform/program.hpp" #include "device/gpu/gpudefs.hpp" //! \namespace gpu GPU Resource Implementation namespace gpu { class Device; class VirtualGPU; /*! \addtogroup GPU GPU Resource Implementation * @{ */ class GslResourceReference : public amd::ReferenceCountedObject { public: //! Default constructor GslResourceReference( const Device& gpuDev, //!< GPU device object gslMemObject gslResource, //!< CAL resource gslMemObject gslResOriginal = NULL //!< Original CAL resource ); //! Get CAL resource gslMemObject gslResource() const { return resource_; } //! Original CAL resource gslMemObject gslOriginal() const { return (resOriginal_ == 0) ? resource_ : resOriginal_; } const Device& device_; //!< GPU device gslMemObject resource_; //!< GSL resource object gslMemObject resOriginal_; //!< Original resource object, NULL if no channel order void* cpuAddress_; //!< CPU address of this memory protected: //! Default destructor ~GslResourceReference(); private: //! Disable copy constructor GslResourceReference(const GslResourceReference&); //! Disable operator= GslResourceReference& operator=(const GslResourceReference&); }; //! GPU resource class Resource : public amd::HeapObject { public: enum InteropType { InteropTypeless = 0, InteropVertexBuffer, InteropIndexBuffer, InteropRenderBuffer, InteropTexture, InteropTextureViewLevel, InteropTextureViewCube, InteropSurface }; struct CreateParams : public amd::StackObject { amd::Memory* owner_; //!< Resource's owner VirtualGPU* gpu_; //!< Resource won't be shared between multiple queues CreateParams(): owner_(NULL), gpu_(NULL) {} }; struct PinnedParams : public CreateParams { const amd::HostMemoryReference* hostMemRef_;//!< System memory pointer for pinning size_t size_; //!< System memory size }; struct ViewParams : public CreateParams { size_t offset_; //!< Alias resource offset size_t size_; //!< Alias resource size const Resource* resource_; //!< Parent resource for the view creation const void* memory_; }; struct ImageViewParams : public CreateParams { size_t level_; //!< Image mip level for a new view size_t layer_; //!< Image layer for a new view const Resource* resource_; //!< Parent resource for the view creation const void* memory_; }; struct ImageBufferParams : public CreateParams { const Resource* resource_; //!< Parent resource for the image creation const void* memory_; }; struct OGLInteropParams : public CreateParams { InteropType type_; //!< OGL resource type CALuint handle_; //!< OGL resource handle uint mipLevel_; //!< Texture mip level uint layer_; //!< Texture layer void* glPlatformContext_; void* glDeviceContext_; uint flags_; }; #ifdef _WIN32 struct D3DInteropParams : public CreateParams { InteropType type_; //!< D3D resource type void* iDirect3D_; //!< D3D resource interface object HANDLE handle_; //!< D3D resource handle uint mipLevel_; //!< Texture mip level int layer_; //!< Texture layer uint misc; //!< miscellaneous cases }; #endif // _WIN32 //! Resource memory enum MemoryType { Empty = 0x0, //!< resource is empty Local, //!< resource in local memory Persistent, //!< resource in persistent memory Remote, //!< resource in nonlocal memory RemoteUSWC, //!< resource in nonlocal memory Pinned, //!< resource in pinned system memory View, //!< resource is an alias OGLInterop, //!< resource is an OGL memory object D3D10Interop, //!< resource is a D3D10 memory object D3D11Interop, //!< resource is a D3D11 memory object Heap, //!< resource is a heap ImageView, //!< resource is a view to some image ImageBuffer, //!< resource is an image view of a buffer BusAddressable, //!< resource is a bus addressable memory ExternalPhysical, //!< resource is an external physical memory D3D9Interop, //!< resource is a D3D9 memory object Scratch //!< resource is scratch memory }; //! Resource map flags enum MapFlags { Discard = 0x00000001, //!< discard lock NoOverwrite = 0x00000002, //!< lock with no overwrite ReadOnly = 0x00000004, //!< lock for read only operation WriteOnly = 0x00000008, //!< lock for write only operation NoWait = 0x00000010, //!< lock with no wait }; //! CAL resource descriptor struct CalResourceDesc : public amd::HeapObject { MemoryType type_; //!< Memory type size_t width_; //!< CAL resource width size_t height_; //!< CAL resource height size_t depth_; //!< CAL resource depth cmSurfFmt format_; //!< GSL resource format CALuint flags_; //!< CAL resource flags, used in creation size_t pitch_; //!< CAL resource pitch, valid if locked CALuint slice_; //!< CAL resource slice, valid if locked gslChannelOrder channelOrder_; //!< GSL resource channel order gslMemObjectAttribType dimension_; //!< GSL resource dimension cl_mem_object_type imageType_; //!< CL image type union { struct { uint dimSize_ : 2; //!< Dimension size uint cardMemory_ : 1; //!< GSL resource is in video memory uint imageArray_ : 1; //!< GSL resource is an array of images uint buffer_ : 1; //!< GSL resource is a buffer uint tiled_ : 1; //!< GSL resource is tiled uint SVMRes_ : 1; //!< SVM flag to the cal resource uint scratch_ : 1; //!< Scratch buffer }; uint state_; }; }; //! Constructor of 1D Resource object Resource( const Device& gpuDev, //!< GPU device object size_t width, //!< resource width cmSurfFmt format //!< resource format ); //! Constructor of Image Resource object Resource( const Device& gpuDev, //!< GPU device object size_t width, //!< resource width size_t height, //!< resource height size_t depth, //!< resource depth cmSurfFmt format, //!< resource format gslChannelOrder chOrder, //!< resource channel order cl_mem_object_type imageType //!< CL image type ); //! Destructor of the resource virtual ~Resource(); /*! \brief Creates a CAL object, associated with the resource * * \return True if we succesfully created a CAL resource */ virtual bool create( MemoryType memType, //!< memory type CreateParams* params = 0, //!< special parameters for resource allocation bool heap = false //!< Global heap allocation for not VM mode ); /*! \brief Reallocates a CAL object, associated with the resource * * \return True if we succesfully reallocated a CAL resource */ bool reallocate( CreateParams* params = 0 //!< special parameters for resource allocation ); /*! \brief Copies a subregion of memory from one resource to another * * This is a general copy from anything to anything (as long as it fits). * All positions and sizes are given in bytes. Note, however, that only * a subset of this general interface is currently implemented. * * \return true if successful */ bool partialMemCopyTo( VirtualGPU& gpu, //!< Virtual GPU device object const amd::Coord3D& srcOrigin, //!< Origin of the source region const amd::Coord3D& dstOrigin, //!< Origin of the destination region const amd::Coord3D& size, //!< Size of the region to copy Resource& dstResource, //!< Destination resource bool enableRectCopy = false, //!< Rectangular DMA support bool flushDMA = false, //!< Flush DMA if requested uint bytesPerElement = 1 //!< Bytes Per Element ) const; /*! \brief Copies size/4 DWORD of memory to a surface * * This is a raw copy to any surface using a CP packet. * Size needs to be atleast a DWORD or multiple * */ void writeRawData( VirtualGPU& gpu, //!< Virtual GPU device object size_t size, //!< Size in bytes of data to be copied(multiple of DWORDS) const void* data, //!< Data to be copied bool waitForEvent //!< Wait for event complete ) const; //! Returns the offset in GPU memory for aliases size_t offset() const { return offset_; } //! Returns the offset in GPU heap uint64_t hbOffset() const { return hbOffset_; } //! Returns the pinned memory offset uint64_t pinOffset() const { return pinOffset_; } //! Returns the size in GPU heap uint64_t hbSize() const { return hbSize_; } //! Returns the GPU device that owns this resource const Device& dev() const { return gpuDevice_; } //! Returns the CAL descriptor for resource const CalResourceDesc* cal() const { return &cal_; } //! Returns the CAL resource handle gslMemObject gslResource() const { return gslRef_->gslResource(); } //! Returns global memory offset uint64_t vmAddress() const { return gslResource()->getSurfaceAddress(); } //! Checks if persistent memory can have a direct map bool isPersistentDirectMap() const; /*! \brief Locks the resource and returns a physical pointer * * \note This operation stalls HW pipeline! * * \return Pointer to the physical memory */ void* map( VirtualGPU* gpu, //!< Virtual GPU device object uint flags = 0, //!< flags for the map operation // Optimization for multilayer map/unmap uint startLayer = 0, //!< Start layer for multilayer map uint numLayers = 0 //!< End layer for multilayer map ); //! Unlocks the resource if it was locked void unmap( VirtualGPU* gpu //!< Virtual GPU device object ); //! Marks the resource as busy void setBusy( VirtualGPU& gpu, //!< Virtual GPU device object GpuEvent calEvent //!< CAL event ) const; //! Wait for the resource void wait( VirtualGPU& gpu, //!< Virtual GPU device object bool waitOnBusyEngine = false//!< Wait only if engine has changed ) const; //! Performs host write to the resource GPU memory bool hostWrite( VirtualGPU* gpu, //!< Virtual GPU device object const void* hostPtr, //!< Host pointer to the SRC data const amd::Coord3D& origin, //!< Offsets for the update const amd::Coord3D& size, //!< The number of bytes to write uint flags = 0, //!< Map flags size_t rowPitch = 0, //!< Raw data row pitch size_t slicePitch = 0 //!< Raw data slice pitch ); //! Performs host read from the resource GPU memory bool hostRead( VirtualGPU* gpu, //!< Virtual GPU device object void* hostPtr, //!< Host pointer to the DST data const amd::Coord3D& origin, //!< Offsets for the update const amd::Coord3D& size, //!< The number of bytes to write size_t rowPitch = 0, //!< Raw data row pitch size_t slicePitch = 0 //!< Raw data slice pitch ); //! Warms up the rename list for this resource void warmUpRenames(VirtualGPU& gpu); //! Gets the resource element size size_t elementSize() const { return elementSize_; } //! Get the mapped address of this resource address data() const { return reinterpret_cast
(address_); } //! Frees all allocated CAL memories and resources, //! associated with this objects. And also destroys all rename structures //! Note: doesn't destroy the object itself void free(); //! Return memory type MemoryType memoryType() const { return cal_.type_; } //! Retunrs true if memory type matches specified bool isMemoryType(MemoryType memType) const; //! Returns TRUE if resource was allocated as cacheable bool isCacheable() const { return (isMemoryType(Remote) || isMemoryType(Pinned)) ? true : false; } //! Returns alias memory object Resource* getAliasUAVBuffer(cmSurfFmt newFormat); bool gslGLAcquire() ; bool gslGLRelease() ; //! Returns HW state for the resource (used for images only) const void* hwState() const { return hwState_; } //! Returns CPU HW SRD for the resource (used for images only) uint64_t hwSrd() const { return hwSrd_; } protected: size_t elementSize_; //!< Size of a single element in bytes private: //! Disable copy constructor Resource(const Resource&); //! Disable operator= Resource& operator=(const Resource&); typedef std::vector