summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2020-04-08 19:34:59 +0200
committerFernando Sahmkow <fsahmkow27@gmail.com>2020-04-08 19:40:46 +0200
commit913f42a3a70d716fa65d639dc4a6dfc9687eec61 (patch)
tree9f95aba901fa11f748f54bcaa39e6c87ff08c802
parentGPUMemoryManager: Improve safety of memory reads. (diff)
downloadyuzu-913f42a3a70d716fa65d639dc4a6dfc9687eec61.tar
yuzu-913f42a3a70d716fa65d639dc4a6dfc9687eec61.tar.gz
yuzu-913f42a3a70d716fa65d639dc4a6dfc9687eec61.tar.bz2
yuzu-913f42a3a70d716fa65d639dc4a6dfc9687eec61.tar.lz
yuzu-913f42a3a70d716fa65d639dc4a6dfc9687eec61.tar.xz
yuzu-913f42a3a70d716fa65d639dc4a6dfc9687eec61.tar.zst
yuzu-913f42a3a70d716fa65d639dc4a6dfc9687eec61.zip
Diffstat (limited to '')
-rw-r--r--src/core/memory.h68
-rw-r--r--src/video_core/memory_manager.h3
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp4
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp4
4 files changed, 75 insertions, 4 deletions
diff --git a/src/core/memory.h b/src/core/memory.h
index 97750f851..b92d678a4 100644
--- a/src/core/memory.h
+++ b/src/core/memory.h
@@ -294,6 +294,24 @@ public:
void ReadBlock(const Kernel::Process& process, VAddr src_addr, void* dest_buffer,
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,
std::size_t size);
@@ -315,6 +333,23 @@ public:
*/
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);
/**
@@ -340,6 +375,23 @@ public:
void WriteBlock(const Kernel::Process& process, VAddr dest_addr, const void* src_buffer,
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,
std::size_t size);
@@ -364,6 +416,22 @@ public:
*/
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);
/**
diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h
index 987400fdd..0d9468535 100644
--- a/src/video_core/memory_manager.h
+++ b/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 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);
private:
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 93a6c72f8..368f399df 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -658,7 +658,7 @@ void RasterizerOpenGL::FlushAll() {}
void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size) {
MICROPROFILE_SCOPE(OpenGL_CacheManagement);
- if (!addr || !size) {
+ if (addr == 0 || size == 0) {
return;
}
texture_cache.FlushRegion(addr, size);
@@ -668,7 +668,7 @@ void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size) {
void RasterizerOpenGL::InvalidateRegion(VAddr addr, u64 size) {
MICROPROFILE_SCOPE(OpenGL_CacheManagement);
- if (!addr || !size) {
+ if (addr == 0 || size == 0) {
return;
}
texture_cache.InvalidateRegion(addr, size);
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
index 1466018fa..30eaeba6c 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/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::FlushRegion(VAddr addr, u64 size) {
- if (!addr || !size) {
+ if (addr == 0 || size == 0) {
return;
}
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) {
- if (!addr || !size) {
+ if (addr == 0 || size == 0) {
return;
}
texture_cache.InvalidateRegion(addr, size);