From 9c234d4d40647d6ae1547cbbd9991c62c57dbdfd Mon Sep 17 00:00:00 2001 From: plutooo Date: Sun, 11 Mar 2018 21:49:22 +0100 Subject: [PATCH] Started sketching on cmd lists --- nx/include/switch.h | 2 ++ nx/include/switch/nvidia/fence.h | 9 +++++++++ nx/include/switch/nvidia/gpu/cmd_list.h | 14 ++++++++++++++ nx/include/switch/nvidia/gpu/gpfifo.h | 7 ++++++- nx/include/switch/nvidia/ioctl.h | 3 +-- nx/source/nvidia/fence.c | 0 nx/source/nvidia/gpu/gpfifo.c | 20 +++++++++++++++++++- 7 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 nx/include/switch/nvidia/fence.h create mode 100644 nx/include/switch/nvidia/gpu/cmd_list.h create mode 100644 nx/source/nvidia/fence.c diff --git a/nx/include/switch.h b/nx/include/switch.h index 75655b43..49a0118f 100644 --- a/nx/include/switch.h +++ b/nx/include/switch.h @@ -77,6 +77,8 @@ extern "C" { #include "switch/nvidia/address_space.h" #include "switch/nvidia/channel.h" #include "switch/nvidia/info.h" +#include "switch/nvidia/fence.h" +#include "switch/nvidia/gpu/cmd_list.h" #include "switch/nvidia/gpu/gpfifo.h" #include "switch/nvidia/gpu/zcull_ctx.h" #include "switch/nvidia/gpu/3d_ctx.h" diff --git a/nx/include/switch/nvidia/fence.h b/nx/include/switch/nvidia/fence.h new file mode 100644 index 00000000..8a525783 --- /dev/null +++ b/nx/include/switch/nvidia/fence.h @@ -0,0 +1,9 @@ +#pragma once + +typedef struct { + nvioctl_fence fence; +} NvFence; + +static inline void nvfenceCreate(NvFence* f, nvioctl_fence* fence) { + f->fence = *fence; +} diff --git a/nx/include/switch/nvidia/gpu/cmd_list.h b/nx/include/switch/nvidia/gpu/cmd_list.h new file mode 100644 index 00000000..24301f2e --- /dev/null +++ b/nx/include/switch/nvidia/gpu/cmd_list.h @@ -0,0 +1,14 @@ +#pragma once + +typedef struct { + NvBuffer buffer; +} NvCmdList; + +static inline iova_t nvcmdsGetGpuAddr() { + return 0; // TODO +} + +static inline u64 nvcmdsGetListSize() { + return 0; // TODO +} + diff --git a/nx/include/switch/nvidia/gpu/gpfifo.h b/nx/include/switch/nvidia/gpu/gpfifo.h index 44d9b06d..d186ced5 100644 --- a/nx/include/switch/nvidia/gpu/gpfifo.h +++ b/nx/include/switch/nvidia/gpu/gpfifo.h @@ -6,4 +6,9 @@ typedef struct { } NvGpfifo; Result nvfifoCreate(NvGpfifo* f, NvChannel* parent); -void nvfifoClose(); +void nvfifoClose(NvGpfifo* f); + +#define NV_MAKE_GPFIFO_ENTRY(iova, size) \ + ((iova) | (((u64)(size)) << 42)) + +Result nvfifoSubmit(NvGpfifo* f, NvCmdList* cmd_list, NvFence* fence_out); diff --git a/nx/include/switch/nvidia/ioctl.h b/nx/include/switch/nvidia/ioctl.h index 8b7e00cd..32a02e20 100644 --- a/nx/include/switch/nvidia/ioctl.h +++ b/nx/include/switch/nvidia/ioctl.h @@ -100,8 +100,7 @@ typedef struct { } nvioctl_fence; typedef struct { - u32 entry0; - u32 entry1; + u64 desc; } nvioctl_gpfifo_entry; // Used with nvioctlChannel_AllocObjCtx(). diff --git a/nx/source/nvidia/fence.c b/nx/source/nvidia/fence.c new file mode 100644 index 00000000..e69de29b diff --git a/nx/source/nvidia/gpu/gpfifo.c b/nx/source/nvidia/gpu/gpfifo.c index 5b88a7fa..577f85e8 100644 --- a/nx/source/nvidia/gpu/gpfifo.c +++ b/nx/source/nvidia/gpu/gpfifo.c @@ -10,6 +10,24 @@ Result nvfifoCreate(NvGpfifo* f, NvChannel* parent) parent->fd, DEFAULT_FIFO_ENTRIES, 1, 0, 0, 0, 0, &f->fifo_fence); } -void nvfifoClose() { +void nvfifoClose(NvGpfifo* f) { /**/ } + +Result nvfifoSubmit(NvGpfifo* f, NvCmdList* cmd_list, NvFence* fence_out) +{ + Result rc; + nvioctl_gpfifo_entry ent; + nvioctl_fence fence; + + ent.desc = nvcmdsGetGpuAddr(cmd_list) | (nvcmdsGetListSize(cmd_list) << 42); + + rc = nvioctlChannel_SubmitGpfifo( + f->parent->fd, &ent, 1, 0/*flags*/, &fence); + + if (R_SUCCEEDED(rc)) { + nvfenceCreate(fence_out, &fence); + } + + return rc; +}