Преглед на файлове

Memory: Address Feedback.

Fernando Sahmkow преди 6 години
родител
ревизия
913f42a3a7
променени са 4 файла, в които са добавени 75 реда и са изтрити 4 реда
  1. 68 0
      src/core/memory.h
  2. 3 0
      src/video_core/memory_manager.h
  3. 2 2
      src/video_core/renderer_opengl/gl_rasterizer.cpp
  4. 2 2
      src/video_core/renderer_vulkan/vk_rasterizer.cpp

+ 68 - 0
src/core/memory.h

@@ -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);
 
 
     /**
     /**

+ 3 - 0
src/video_core/memory_manager.h

@@ -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:

+ 2 - 2
src/video_core/renderer_opengl/gl_rasterizer.cpp

@@ -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);

+ 2 - 2
src/video_core/renderer_vulkan/vk_rasterizer.cpp

@@ -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);