Memory: Address Feedback.
This commit is contained in:
		| @@ -294,6 +294,24 @@ public: | |||||||
|     void ReadBlock(const Kernel::Process& process, VAddr src_addr, void* dest_buffer, |     void ReadBlock(const Kernel::Process& process, VAddr src_addr, void* dest_buffer, | ||||||
|                    std::size_t size); |                    std::size_t size); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Reads a contiguous block of bytes from a specified process' address space. | ||||||
|  |      * This unsafe version does not trigger GPU flushing. | ||||||
|  |      * | ||||||
|  |      * @param process     The process to read the data from. | ||||||
|  |      * @param src_addr    The virtual address to begin reading from. | ||||||
|  |      * @param dest_buffer The buffer to place the read bytes into. | ||||||
|  |      * @param size        The amount of data to read, in bytes. | ||||||
|  |      * | ||||||
|  |      * @note If a size of 0 is specified, then this function reads nothing and | ||||||
|  |      *       no attempts to access memory are made at all. | ||||||
|  |      * | ||||||
|  |      * @pre dest_buffer must be at least size bytes in length, otherwise a | ||||||
|  |      *      buffer overrun will occur. | ||||||
|  |      * | ||||||
|  |      * @post The range [dest_buffer, size) contains the read bytes from the | ||||||
|  |      *       process' address space. | ||||||
|  |      */ | ||||||
|     void ReadBlockUnsafe(const Kernel::Process& process, VAddr src_addr, void* dest_buffer, |     void ReadBlockUnsafe(const Kernel::Process& process, VAddr src_addr, void* dest_buffer, | ||||||
|                          std::size_t size); |                          std::size_t size); | ||||||
|  |  | ||||||
| @@ -315,6 +333,23 @@ public: | |||||||
|      */ |      */ | ||||||
|     void ReadBlock(VAddr src_addr, void* dest_buffer, std::size_t size); |     void ReadBlock(VAddr src_addr, void* dest_buffer, std::size_t size); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Reads a contiguous block of bytes from the current process' address space. | ||||||
|  |      * This unsafe version does not trigger GPU flushing. | ||||||
|  |      * | ||||||
|  |      * @param src_addr    The virtual address to begin reading from. | ||||||
|  |      * @param dest_buffer The buffer to place the read bytes into. | ||||||
|  |      * @param size        The amount of data to read, in bytes. | ||||||
|  |      * | ||||||
|  |      * @note If a size of 0 is specified, then this function reads nothing and | ||||||
|  |      *       no attempts to access memory are made at all. | ||||||
|  |      * | ||||||
|  |      * @pre dest_buffer must be at least size bytes in length, otherwise a | ||||||
|  |      *      buffer overrun will occur. | ||||||
|  |      * | ||||||
|  |      * @post The range [dest_buffer, size) contains the read bytes from the | ||||||
|  |      *       current process' address space. | ||||||
|  |      */ | ||||||
|     void ReadBlockUnsafe(VAddr src_addr, void* dest_buffer, std::size_t size); |     void ReadBlockUnsafe(VAddr src_addr, void* dest_buffer, std::size_t size); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -340,6 +375,23 @@ public: | |||||||
|     void WriteBlock(const Kernel::Process& process, VAddr dest_addr, const void* src_buffer, |     void WriteBlock(const Kernel::Process& process, VAddr dest_addr, const void* src_buffer, | ||||||
|                     std::size_t size); |                     std::size_t size); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Writes a range of bytes into a given process' address space at the specified | ||||||
|  |      * virtual address. | ||||||
|  |      * This unsafe version does not invalidate GPU Memory. | ||||||
|  |      * | ||||||
|  |      * @param process    The process to write data into the address space of. | ||||||
|  |      * @param dest_addr  The destination virtual address to begin writing the data at. | ||||||
|  |      * @param src_buffer The data to write into the process' address space. | ||||||
|  |      * @param size       The size of the data to write, in bytes. | ||||||
|  |      * | ||||||
|  |      * @post The address range [dest_addr, size) in the process' address space | ||||||
|  |      *       contains the data that was within src_buffer. | ||||||
|  |      * | ||||||
|  |      * @post If an attempt is made to write into an unmapped region of memory, the writes | ||||||
|  |      *       will be ignored and an error will be logged. | ||||||
|  |      * | ||||||
|  |      */ | ||||||
|     void WriteBlockUnsafe(const Kernel::Process& process, VAddr dest_addr, const void* src_buffer, |     void WriteBlockUnsafe(const Kernel::Process& process, VAddr dest_addr, const void* src_buffer, | ||||||
|                           std::size_t size); |                           std::size_t size); | ||||||
|  |  | ||||||
| @@ -364,6 +416,22 @@ public: | |||||||
|      */ |      */ | ||||||
|     void WriteBlock(VAddr dest_addr, const void* src_buffer, std::size_t size); |     void WriteBlock(VAddr dest_addr, const void* src_buffer, std::size_t size); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Writes a range of bytes into the current process' address space at the specified | ||||||
|  |      * virtual address. | ||||||
|  |      * This unsafe version does not invalidate GPU Memory. | ||||||
|  |      * | ||||||
|  |      * @param dest_addr  The destination virtual address to begin writing the data at. | ||||||
|  |      * @param src_buffer The data to write into the current process' address space. | ||||||
|  |      * @param size       The size of the data to write, in bytes. | ||||||
|  |      * | ||||||
|  |      * @post The address range [dest_addr, size) in the current process' address space | ||||||
|  |      *       contains the data that was within src_buffer. | ||||||
|  |      * | ||||||
|  |      * @post If an attempt is made to write into an unmapped region of memory, the writes | ||||||
|  |      *       will be ignored and an error will be logged. | ||||||
|  |      * | ||||||
|  |      */ | ||||||
|     void WriteBlockUnsafe(VAddr dest_addr, const void* src_buffer, std::size_t size); |     void WriteBlockUnsafe(VAddr dest_addr, const void* src_buffer, std::size_t size); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|   | |||||||
| @@ -97,6 +97,9 @@ public: | |||||||
|     void WriteBlockUnsafe(GPUVAddr dest_addr, const void* src_buffer, std::size_t size); |     void WriteBlockUnsafe(GPUVAddr dest_addr, const void* src_buffer, std::size_t size); | ||||||
|     void CopyBlockUnsafe(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size); |     void CopyBlockUnsafe(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * IsGranularRange checks if a gpu region can be simply read with a pointer | ||||||
|  |      */ | ||||||
|     bool IsGranularRange(GPUVAddr gpu_addr, std::size_t size); |     bool IsGranularRange(GPUVAddr gpu_addr, std::size_t size); | ||||||
|  |  | ||||||
| private: | private: | ||||||
|   | |||||||
| @@ -658,7 +658,7 @@ void RasterizerOpenGL::FlushAll() {} | |||||||
|  |  | ||||||
| void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size) { | void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size) { | ||||||
|     MICROPROFILE_SCOPE(OpenGL_CacheManagement); |     MICROPROFILE_SCOPE(OpenGL_CacheManagement); | ||||||
|     if (!addr || !size) { |     if (addr == 0 || size == 0) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     texture_cache.FlushRegion(addr, size); |     texture_cache.FlushRegion(addr, size); | ||||||
| @@ -668,7 +668,7 @@ void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size) { | |||||||
|  |  | ||||||
| void RasterizerOpenGL::InvalidateRegion(VAddr addr, u64 size) { | void RasterizerOpenGL::InvalidateRegion(VAddr addr, u64 size) { | ||||||
|     MICROPROFILE_SCOPE(OpenGL_CacheManagement); |     MICROPROFILE_SCOPE(OpenGL_CacheManagement); | ||||||
|     if (!addr || !size) { |     if (addr == 0 || size == 0) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     texture_cache.InvalidateRegion(addr, size); |     texture_cache.InvalidateRegion(addr, size); | ||||||
|   | |||||||
| @@ -496,7 +496,7 @@ void RasterizerVulkan::Query(GPUVAddr gpu_addr, VideoCore::QueryType type, | |||||||
| void RasterizerVulkan::FlushAll() {} | void RasterizerVulkan::FlushAll() {} | ||||||
|  |  | ||||||
| void RasterizerVulkan::FlushRegion(VAddr addr, u64 size) { | void RasterizerVulkan::FlushRegion(VAddr addr, u64 size) { | ||||||
|     if (!addr || !size) { |     if (addr == 0 || size == 0) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     CacheAddr cache_addr = ToCacheAddr(system.Memory().GetPointer(addr)); |     CacheAddr cache_addr = ToCacheAddr(system.Memory().GetPointer(addr)); | ||||||
| @@ -506,7 +506,7 @@ void RasterizerVulkan::FlushRegion(VAddr addr, u64 size) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void RasterizerVulkan::InvalidateRegion(VAddr addr, u64 size) { | void RasterizerVulkan::InvalidateRegion(VAddr addr, u64 size) { | ||||||
|     if (!addr || !size) { |     if (addr == 0 || size == 0) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     texture_cache.InvalidateRegion(addr, size); |     texture_cache.InvalidateRegion(addr, size); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user