mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 12:32:40 +02:00
Implemented zcull_ctx, 3d_ctx, random fixes
This commit is contained in:
parent
cff044f497
commit
1a22b484f8
@ -20,7 +20,7 @@ Result nvasReserveAlign(NvAddressSpace* a, NvPageSize align, u32 pages, NvPageSi
|
|||||||
Result nvasReserveAtFixedAddr(NvAddressSpace* a, iova_t addr, u32 pages, NvPageSize page_sz);
|
Result nvasReserveAtFixedAddr(NvAddressSpace* a, iova_t addr, u32 pages, NvPageSize page_sz);
|
||||||
Result nvasReserveFull(NvAddressSpace* a);
|
Result nvasReserveFull(NvAddressSpace* a);
|
||||||
|
|
||||||
Result nvasMapBuffer(NvAddressSpace* a, NvBuffer* buffer, NvBufferKind kind, iova_t* iova_out);
|
Result nvasMapBuffer(NvAddressSpace* a, NvBuffer* buffer, iova_t* iova_out);
|
||||||
|
|
||||||
struct NvChannel;
|
struct NvChannel;
|
||||||
Result nvasBindToChannel(NvAddressSpace* a, struct NvChannel* channel);
|
Result nvasBindToChannel(NvAddressSpace* a, struct NvChannel* channel);
|
||||||
|
@ -2,19 +2,12 @@
|
|||||||
|
|
||||||
#include "../types.h"
|
#include "../types.h"
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
u32 fd;
|
|
||||||
u32 size;
|
|
||||||
void* ptr;
|
|
||||||
bool has_init;
|
|
||||||
} NvBuffer;
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NvBufferFlags_Writable=1
|
NvBufferFlags_Writable=1
|
||||||
} NvBufferFlags;
|
} NvBufferFlags;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NvBufferKind_PitCh=0x0,
|
NvBufferKind_Pitch=0x0,
|
||||||
NvBufferKind_Z16=0x1,
|
NvBufferKind_Z16=0x1,
|
||||||
NvBufferKind_Z16_2C=0x2,
|
NvBufferKind_Z16_2C=0x2,
|
||||||
NvBufferKind_Z16_MS2_2C=0x3,
|
NvBufferKind_Z16_MS2_2C=0x3,
|
||||||
@ -249,8 +242,16 @@ typedef enum {
|
|||||||
NvBufferKind_Invalid=0xff,
|
NvBufferKind_Invalid=0xff,
|
||||||
} NvBufferKind;
|
} NvBufferKind;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u32 fd;
|
||||||
|
u32 size;
|
||||||
|
void* ptr;
|
||||||
|
NvBufferKind kind;
|
||||||
|
bool has_init;
|
||||||
|
} NvBuffer;
|
||||||
|
|
||||||
Result nvbufInit(void);
|
Result nvbufInit(void);
|
||||||
void nvbufExit(void);
|
void nvbufExit(void);
|
||||||
|
|
||||||
Result nvbufCreate(NvBuffer* m, size_t size, u32 align, NvBufferKind kind);
|
Result nvbufCreate(NvBuffer* m, size_t size, u32 align, NvBufferKind kind);
|
||||||
Result nvbufCreateRw(NvBuffer* m, size_t size, u32 align, NvBufferKind kind);
|
Result nvbufCreateRw(NvBuffer* m, size_t size, u32 align, NvBufferKind kind);
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include "ioctl.h"
|
||||||
|
|
||||||
typedef struct NvChannel {
|
typedef struct NvChannel {
|
||||||
u32 fd;
|
u32 fd;
|
||||||
@ -6,4 +7,6 @@ typedef struct NvChannel {
|
|||||||
} NvChannel;
|
} NvChannel;
|
||||||
|
|
||||||
Result nvchannelCreate(NvChannel* c, const char* dev);
|
Result nvchannelCreate(NvChannel* c, const char* dev);
|
||||||
void nvchannelClose(NvChannel* c);
|
void nvchannelClose(NvChannel* c);
|
||||||
|
|
||||||
|
Result nvchannelSetPriority(NvChannel* c, NvChannelPriority prio);
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
typedef struct NvGpu NvGpu;
|
typedef struct NvGpu NvGpu;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
NvGpu* parent;
|
NvGpu* parent;
|
||||||
|
NvBuffer ctx_buf;
|
||||||
} NvZcullContext;
|
} NvZcullContext;
|
||||||
|
|
||||||
Result nvzcullCreate(NvZcullContext* z, NvGpu* parent);
|
Result nvzcullCreate(NvZcullContext* z, NvGpu* parent);
|
||||||
|
@ -104,22 +104,30 @@ typedef struct {
|
|||||||
u32 entry1;
|
u32 entry1;
|
||||||
} nvioctl_gpfifo_entry;
|
} nvioctl_gpfifo_entry;
|
||||||
|
|
||||||
//Used with nvioctlChannel_AllocObjCtx().
|
// Used with nvioctlChannel_AllocObjCtx().
|
||||||
enum nvioctl_channel_obj_classnum {
|
typedef enum nvioctl_channel_obj_classnum {
|
||||||
NvChannelObjClassNum_2D = 0x902D,
|
NvClassNumber_2D = 0x902D,
|
||||||
NvChannelObjClassNum_3D = 0xB197,
|
NvClassNumber_3D = 0xB197,
|
||||||
NvChannelObjClassNum_Compute = 0xB1C0,
|
NvClassNumber_Compute = 0xB1C0,
|
||||||
NvChannelObjClassNum_Kepler = 0xA140,
|
NvClassNumber_Kepler = 0xA140,
|
||||||
NvChannelObjClassNum_DMA = 0xB0B5,
|
NvClassNumber_DMA = 0xB0B5,
|
||||||
NvChannelObjClassNum_ChannelGpfifo = 0xB06F
|
NvClassNumber_ChannelGpfifo = 0xB06F
|
||||||
};
|
} NvClassNumber;
|
||||||
|
|
||||||
//Used with nvioctlChannel_SetPriority().
|
// Used with nvioctlChannel_SetPriority().
|
||||||
enum nvioctl_channel_priority {
|
typedef enum nvioctl_channel_priority {
|
||||||
NvChannelPriority_Low = 0x32,
|
NvChannelPriority_Low = 50,
|
||||||
NvChannelPriority_Medium = 0x64,
|
NvChannelPriority_Medium = 100,
|
||||||
NvChannelPriority_High = 0x96
|
NvChannelPriority_High = 150
|
||||||
};
|
} NvChannelPriority;
|
||||||
|
|
||||||
|
// Used with nvioctlChannel_ZCullBind().
|
||||||
|
typedef enum {
|
||||||
|
NvZcullConfig_Global = 0,
|
||||||
|
NvZcullConfig_NoCtxSwitch = 1,
|
||||||
|
NvZcullConfig_SeparateBuffer = 2,
|
||||||
|
NvZcullConfig_PartOfRegularBuffer = 3
|
||||||
|
} NvZcullConfig;
|
||||||
|
|
||||||
Result nvioctlNvhostCtrl_EventSignal(u32 fd, u32 event_id);
|
Result nvioctlNvhostCtrl_EventSignal(u32 fd, u32 event_id);
|
||||||
Result nvioctlNvhostCtrl_EventWait(u32 fd, u32 syncpt_id, u32 threshold, s32 timeout, u32 event_id, u32 *out);
|
Result nvioctlNvhostCtrl_EventWait(u32 fd, u32 syncpt_id, u32 threshold, s32 timeout, u32 event_id, u32 *out);
|
||||||
|
@ -43,8 +43,8 @@ Result nvasReserveFull(NvAddressSpace* a) {
|
|||||||
return nvasReserveAlign(a, NvPageSize_64K, 0x10000, NvPageSize_64K, NULL);
|
return nvasReserveAlign(a, NvPageSize_64K, 0x10000, NvPageSize_64K, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result nvasMapBuffer(NvAddressSpace* a, NvBuffer* buffer, NvBufferKind kind, iova_t* iova_out) {
|
Result nvasMapBuffer(NvAddressSpace* a, NvBuffer* buffer, iova_t* iova_out) {
|
||||||
return nvioctlNvhostAsGpu_MapBufferEx(a->fd, 0, kind, buffer->fd, 0, 0, buffer->size, 0, iova_out);
|
return nvioctlNvhostAsGpu_MapBufferEx(a->fd, 0, buffer->kind, buffer->fd, 0, 0, buffer->size, 0, iova_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result nvasBindToChannel(NvAddressSpace* a, NvChannel* channel)
|
Result nvasBindToChannel(NvAddressSpace* a, NvChannel* channel)
|
||||||
|
@ -43,6 +43,7 @@ static Result _nvbufCreate(NvBuffer* m, size_t size, u32 flags, u32 align, NvBuf
|
|||||||
m->size = size;
|
m->size = size;
|
||||||
m->fd = -1;
|
m->fd = -1;
|
||||||
m->ptr = memalign(size, align);
|
m->ptr = memalign(size, align);
|
||||||
|
m->kind = kind;
|
||||||
|
|
||||||
if (m->ptr == NULL)
|
if (m->ptr == NULL)
|
||||||
return MAKERESULT(Module_Libnx, LibnxError_OutOfMemory);
|
return MAKERESULT(Module_Libnx, LibnxError_OutOfMemory);
|
||||||
|
@ -27,3 +27,7 @@ void nvchannelClose(NvChannel* c)
|
|||||||
|
|
||||||
c->fd = -1;
|
c->fd = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result nvchannelSetPriority(NvChannel* c, NvChannelPriority prio) {
|
||||||
|
return nvioctlChannel_SetPriority(c->fd, prio);
|
||||||
|
}
|
||||||
|
@ -3,9 +3,7 @@
|
|||||||
Result nv3dCreate(Nv3dContext* t, NvGpu* parent)
|
Result nv3dCreate(Nv3dContext* t, NvGpu* parent)
|
||||||
{
|
{
|
||||||
t->parent = parent;
|
t->parent = parent;
|
||||||
|
return nvioctlChannel_AllocObjCtx(parent->gpu_channel.fd, NvClassNumber_3D, 0, &t->obj_id);
|
||||||
// TODO: Get class number from nvinfo*().
|
|
||||||
return nvioctlChannel_AllocObjCtx(parent->gpu_channel.fd, 0xB197, 0, &t->obj_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void nv3dClose(Nv3dContext* t) {
|
void nv3dClose(Nv3dContext* t) {
|
||||||
|
@ -2,10 +2,23 @@
|
|||||||
|
|
||||||
Result nvzcullCreate(NvZcullContext* z, NvGpu* parent)
|
Result nvzcullCreate(NvZcullContext* z, NvGpu* parent)
|
||||||
{
|
{
|
||||||
|
Result rc;
|
||||||
|
|
||||||
z->parent = parent;
|
z->parent = parent;
|
||||||
return 0;
|
rc = nvbufCreateRw(&z->ctx_buf, nvinfoGetZcullCtxSize(), 0x1000, NvBufferKind_Pitch);
|
||||||
|
|
||||||
|
iova_t iova_out;
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = nvasMapBuffer(&parent->addr_space, &z->ctx_buf, &iova_out);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = nvioctlChannel_ZCullBind(parent->gpu_channel.fd, iova_out, NvZcullConfig_SeparateBuffer);
|
||||||
|
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nvzcullClose(NvZcullContext* z) {
|
void nvzcullClose(NvZcullContext* z) {
|
||||||
/**/
|
// TODO: Unmap z->ctx_buf from parent->addr_space?
|
||||||
|
nvbufFree(&z->ctx_buf);
|
||||||
}
|
}
|
||||||
|
@ -56,10 +56,18 @@ Result nvioctlChannel_AllocObjCtx(u32 fd, u32 class_num, u32 flags, u64* id_out)
|
|||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.class_num = class_num;
|
data.class_num = class_num;
|
||||||
data.flags = flags;
|
data.flags = flags;
|
||||||
if (id_out != NULL)
|
data.obj_id = 0xDEADBEEF;
|
||||||
*id_out = data.obj_id;
|
|
||||||
|
Result rc = nvIoctl(fd, _NV_IOWR(0x48, 0x09, data), &data);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
if (id_out != NULL) {
|
||||||
|
*id_out = data.obj_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
return nvIoctl(fd, _NV_IOWR(0x48, 0x09, data), &data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Result nvioctlChannel_ZCullBind(u32 fd, u64 gpu_va, u32 mode) {
|
Result nvioctlChannel_ZCullBind(u32 fd, u64 gpu_va, u32 mode) {
|
||||||
|
Loading…
Reference in New Issue
Block a user