summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/nvdrv
diff options
context:
space:
mode:
authorSubv <subv2112@gmail.com>2018-07-01 17:48:50 +0200
committerSubv <subv2112@gmail.com>2018-07-01 17:48:50 +0200
commita093feca62982f33be89811b89b6f3f412ef4815 (patch)
tree71f22b73a25042a692fe5a56b34bab0ce4170747 /src/core/hle/service/nvdrv
parentMerge pull request #595 from bunnei/raster-cache (diff)
downloadyuzu-a093feca62982f33be89811b89b6f3f412ef4815.tar
yuzu-a093feca62982f33be89811b89b6f3f412ef4815.tar.gz
yuzu-a093feca62982f33be89811b89b6f3f412ef4815.tar.bz2
yuzu-a093feca62982f33be89811b89b6f3f412ef4815.tar.lz
yuzu-a093feca62982f33be89811b89b6f3f412ef4815.tar.xz
yuzu-a093feca62982f33be89811b89b6f3f412ef4815.tar.zst
yuzu-a093feca62982f33be89811b89b6f3f412ef4815.zip
Diffstat (limited to 'src/core/hle/service/nvdrv')
-rw-r--r--src/core/hle/service/nvdrv/devices/nvmap.cpp13
-rw-r--r--src/core/hle/service/nvdrv/devices/nvmap.h2
2 files changed, 11 insertions, 4 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvmap.cpp b/src/core/hle/service/nvdrv/devices/nvmap.cpp
index 23fe98190..2fc7c87e0 100644
--- a/src/core/hle/service/nvdrv/devices/nvmap.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvmap.cpp
@@ -148,6 +148,7 @@ u32 nvmap::IocParam(const std::vector<u8>& input, std::vector<u8>& output) {
}
u32 nvmap::IocFree(const std::vector<u8>& input, std::vector<u8>& output) {
+ // TODO(Subv): These flags are unconfirmed.
enum FreeFlags {
Freed = 0,
NotFreedYet = 1,
@@ -161,15 +162,21 @@ u32 nvmap::IocFree(const std::vector<u8>& input, std::vector<u8>& output) {
auto itr = handles.find(params.handle);
ASSERT(itr != handles.end());
+ ASSERT(itr->second->refcount > 0);
+
itr->second->refcount--;
- params.refcount = itr->second->refcount;
params.size = itr->second->size;
- if (itr->second->refcount == 0)
+ if (itr->second->refcount == 0) {
params.flags = Freed;
- else
+ // The address of the nvmap is written to the output if we're finally freeing it, otherwise
+ // 0 is written.
+ params.address = itr->second->addr;
+ } else {
params.flags = NotFreedYet;
+ params.address = 0;
+ }
handles.erase(params.handle);
diff --git a/src/core/hle/service/nvdrv/devices/nvmap.h b/src/core/hle/service/nvdrv/devices/nvmap.h
index 39fafaa7c..f2eec6409 100644
--- a/src/core/hle/service/nvdrv/devices/nvmap.h
+++ b/src/core/hle/service/nvdrv/devices/nvmap.h
@@ -94,7 +94,7 @@ private:
struct IocFreeParams {
u32_le handle;
INSERT_PADDING_BYTES(4);
- u64_le refcount;
+ u64_le address;
u32_le size;
u32_le flags;
};