Skip to content

Commit f2e5ff3

Browse files
committed
NV097_SET_CONTEXT_DMA_A, NV097_SET_CONTEXT_DMA_B, NV097_SET_CONTEXT_DMA_STATE, NV097_SET_CONTEXT_DMA_COLOR, NV097_SET_CONTEXT_DMA_ZETA, NV097_SET_CONTEXT_DMA_VERTEX_A, NV097_SET_CONTEXT_DMA_VERTEX_B, NV097_SET_CONTEXT_DMA_SEMAPHORE, NV097_SET_CONTEXT_DMA_REPORT, NV097_SET_SEMAPHORE_OFFSET, NV097_BACK_END_WRITE_SEMAPHORE_RELEASE
1 parent 1bfc757 commit f2e5ff3

2 files changed

Lines changed: 129 additions & 10 deletions

File tree

src/nxbx/hw/video/gpu/nv2a_classes.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,17 @@ enum class nv097 : uint32_t
3939
{
4040
NV097_SET_OBJECT = 0x00000000,
4141
NV097_SET_CONTEXT_DMA_NOTIFIES = 0x00000180,
42+
NV097_SET_CONTEXT_DMA_A = 0x00000184,
43+
NV097_SET_CONTEXT_DMA_B = 0x00000188,
44+
NV097_SET_CONTEXT_DMA_STATE = 0x00000190,
45+
NV097_SET_CONTEXT_DMA_COLOR = 0x00000194,
46+
NV097_SET_CONTEXT_DMA_ZETA = 0x00000198,
47+
NV097_SET_CONTEXT_DMA_VERTEX_A = 0x0000019C,
48+
NV097_SET_CONTEXT_DMA_VERTEX_B = 0x000001A0,
49+
NV097_SET_CONTEXT_DMA_SEMAPHORE = 0x000001A4,
50+
NV097_SET_CONTEXT_DMA_REPORT = 0x000001A8,
51+
NV097_SET_SEMAPHORE_OFFSET = 0x00001D6C,
52+
NV097_BACK_END_WRITE_SEMAPHORE_RELEASE = 0x00001D70,
4253
};
4354

4455
enum class nv09f : uint32_t

src/nxbx/hw/video/gpu/pgraph.cpp

Lines changed: 118 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,24 @@
2626
#define IMPL(class_) auto class_impl = &impl->class_
2727
#define MTHD_HANDLER_ARGS pgraph::ImplAlias *impl, uint32_t mthd, uint32_t param, uint32_t subchan
2828
#define UNBOUND_OBJ_ADDR -1U
29-
#define NV09F_OBJ_NOTIFIES_idx 0
30-
#define NV09F_OBJ_COLOR_KEY_idx 1
31-
#define NV09F_OBJ_CLIP_RECTANGLE_idx 2
32-
#define NV09F_OBJ_PATTERN_idx 3
33-
#define NV09F_OBJ_ROP_idx 4
34-
#define NV09F_OBJ_BETA1_idx 5
35-
#define NV09F_OBJ_BETA4_idx 6
36-
#define NV09F_OBJ_SURFACES_idx 7
29+
#define NV09F_OBJ_NOTIFIES_idx 0
30+
#define NV09F_OBJ_COLOR_KEY_idx 1
31+
#define NV09F_OBJ_CLIP_RECTANGLE_idx 2
32+
#define NV09F_OBJ_PATTERN_idx 3
33+
#define NV09F_OBJ_ROP_idx 4
34+
#define NV09F_OBJ_BETA1_idx 5
35+
#define NV09F_OBJ_BETA4_idx 6
36+
#define NV09F_OBJ_SURFACES_idx 7
37+
#define NV097_OBJ_NOTIFIES_idx 0
38+
#define NV097_OBJ_A_idx 1
39+
#define NV097_OBJ_B_idx 2
40+
#define NV097_OBJ_STATE_idx 3
41+
#define NV097_OBJ_COLOR_idx 4
42+
#define NV097_OBJ_ZETA_idx 5
43+
#define NV097_OBJ_VTXA_idx 6
44+
#define NV097_OBJ_VTXB_idx 7
45+
#define NV097_OBJ_SEMAPHORE_idx 8
46+
#define NV097_OBJ_REPORT_idx 9
3747

3848
// Macros used in InputQueueEntry for ctx switches
3949
#define CTX_SWITCH_CHID 0x1F // target channel
@@ -87,8 +97,12 @@ class pgraph::Impl
8797
friend void NV062_SET_CONTEXT_DMA_IMAGE_DESTIN(MTHD_HANDLER_ARGS);
8898

8999
friend void dispatch_nv097(MTHD_HANDLER_ARGS);
100+
friend void nv097_set_dma_obj(pgraph::ImplAlias *impl, uint32_t param, uint32_t idx);
90101
friend void NV097_SET_OBJECT(MTHD_HANDLER_ARGS);
91102
friend void NV097_SET_CONTEXT_DMA_NOTIFIES(MTHD_HANDLER_ARGS);
103+
friend void NV097_SET_CONTEXT_DMA_SEMAPHORE(MTHD_HANDLER_ARGS);
104+
friend void NV097_SET_SEMAPHORE_OFFSET(MTHD_HANDLER_ARGS);
105+
friend void NV097_BACK_END_WRITE_SEMAPHORE_RELEASE(MTHD_HANDLER_ARGS);
92106

93107
friend void dispatch_nv09f(MTHD_HANDLER_ARGS);
94108
friend void nv09f_set_dma_obj(pgraph::ImplAlias *impl, uint32_t param, uint32_t gr_class, uint32_t idx);
@@ -139,8 +153,13 @@ class pgraph::Impl
139153
{
140154
// NV20_KELVIN_PRIMITIVE
141155
uint32_t m_instance_addr;
142-
uint32_t m_notification_addr;
143156
bool m_notification_active;
157+
uint32_t m_dma_obj_instance_addr[10];
158+
struct
159+
{
160+
uint8_t *base;
161+
uint32_t limit;
162+
} m_dma_semaphore;
144163
} m_kelvin;
145164
struct
146165
{
@@ -235,6 +254,11 @@ void NV062_SET_CONTEXT_DMA_IMAGE_DESTIN(MTHD_HANDLER_ARGS)
235254
impl->m_ctx_surfaces_2d.m_img_dst_addr = param;
236255
}
237256

257+
void nv097_set_dma_obj(pgraph::ImplAlias *impl, uint32_t param, uint32_t idx)
258+
{
259+
impl->m_kelvin.m_dma_obj_instance_addr[idx] = param;
260+
}
261+
238262
void NV097_SET_OBJECT(MTHD_HANDLER_ARGS)
239263
{
240264
// Binds the engine object to the subchannel
@@ -246,10 +270,82 @@ void NV097_SET_CONTEXT_DMA_NOTIFIES(MTHD_HANDLER_ARGS)
246270
// Same as NV039_SET_CONTEXT_DMA_NOTIFIES, but for nv97
247271

248272
IMPL(m_kelvin);
249-
class_impl->m_notification_addr = param;
273+
class_impl->m_dma_obj_instance_addr[NV097_OBJ_NOTIFIES_idx] = param;
250274
class_impl->m_notification_active = false;
251275
}
252276

277+
void NV097_SET_CONTEXT_DMA_A(MTHD_HANDLER_ARGS)
278+
{
279+
nv097_set_dma_obj(impl, param, NV097_OBJ_A_idx);
280+
}
281+
282+
void NV097_SET_CONTEXT_DMA_B(MTHD_HANDLER_ARGS)
283+
{
284+
nv097_set_dma_obj(impl, param, NV097_OBJ_B_idx);
285+
}
286+
287+
void NV097_SET_CONTEXT_DMA_STATE(MTHD_HANDLER_ARGS)
288+
{
289+
nv097_set_dma_obj(impl, param, NV097_OBJ_STATE_idx);
290+
}
291+
292+
void NV097_SET_CONTEXT_DMA_COLOR(MTHD_HANDLER_ARGS)
293+
{
294+
// TODO: rendering stuff here
295+
nv097_set_dma_obj(impl, param, NV097_OBJ_COLOR_idx);
296+
}
297+
298+
void NV097_SET_CONTEXT_DMA_ZETA(MTHD_HANDLER_ARGS)
299+
{
300+
// TODO: rendering stuff here
301+
nv097_set_dma_obj(impl, param, NV097_OBJ_ZETA_idx);
302+
}
303+
304+
void NV097_SET_CONTEXT_DMA_VERTEX_A(MTHD_HANDLER_ARGS)
305+
{
306+
nv097_set_dma_obj(impl, param, NV097_OBJ_VTXA_idx);
307+
}
308+
309+
void NV097_SET_CONTEXT_DMA_VERTEX_B(MTHD_HANDLER_ARGS)
310+
{
311+
nv097_set_dma_obj(impl, param, NV097_OBJ_VTXB_idx);
312+
}
313+
314+
void NV097_SET_CONTEXT_DMA_SEMAPHORE(MTHD_HANDLER_ARGS)
315+
{
316+
// Sets up the semaphore dma object of pgraph
317+
318+
IMPL(m_kelvin);
319+
DmaObj obj = impl->m_nv2a->getDmaObj(param);
320+
class_impl->m_dma_semaphore.base = impl->m_ram + obj.target_addr;
321+
class_impl->m_dma_semaphore.limit = obj.limit;
322+
class_impl->m_dma_obj_instance_addr[NV097_OBJ_SEMAPHORE_idx] = param;
323+
}
324+
325+
void NV097_SET_CONTEXT_DMA_REPORT(MTHD_HANDLER_ARGS)
326+
{
327+
// TODO: rendering stuff here
328+
nv097_set_dma_obj(impl, param, NV097_OBJ_REPORT_idx);
329+
}
330+
331+
void NV097_SET_SEMAPHORE_OFFSET(MTHD_HANDLER_ARGS)
332+
{
333+
// Sets the offset, from the base of the semaphore dma object, to write the DWORD that signals the semaphore
334+
335+
IMPL(m_kelvin);
336+
assert(param <= class_impl->m_dma_semaphore.limit);
337+
class_impl->m_dma_semaphore.base += param;
338+
}
339+
340+
void NV097_BACK_END_WRITE_SEMAPHORE_RELEASE(MTHD_HANDLER_ARGS)
341+
{
342+
// Writes param at the offset of the semaphore dma object
343+
344+
IMPL(m_kelvin);
345+
assert(class_impl->m_dma_obj_instance_addr[NV097_OBJ_SEMAPHORE_idx] != UNBOUND_OBJ_ADDR);
346+
*(uint32_t *)class_impl->m_dma_semaphore.base = param;
347+
}
348+
253349
void nv09f_set_dma_obj(pgraph::ImplAlias *impl, uint32_t param, uint32_t gr_class, uint32_t idx)
254350
{
255351
DmaObj obj = impl->m_nv2a->getDmaObj(param);
@@ -354,6 +450,17 @@ constexpr auto dispatch_func_nv097(uint32_t mthd)
354450
{
355451
MTHD_BEGIN(NV097_SET_OBJECT)
356452
MTHD_CASE(NV097_SET_CONTEXT_DMA_NOTIFIES)
453+
MTHD_CASE(NV097_SET_CONTEXT_DMA_A)
454+
MTHD_CASE(NV097_SET_CONTEXT_DMA_B)
455+
MTHD_CASE(NV097_SET_CONTEXT_DMA_STATE)
456+
MTHD_CASE(NV097_SET_CONTEXT_DMA_COLOR)
457+
MTHD_CASE(NV097_SET_CONTEXT_DMA_ZETA)
458+
MTHD_CASE(NV097_SET_CONTEXT_DMA_VERTEX_A)
459+
MTHD_CASE(NV097_SET_CONTEXT_DMA_VERTEX_B)
460+
MTHD_CASE(NV097_SET_CONTEXT_DMA_SEMAPHORE)
461+
MTHD_CASE(NV097_SET_CONTEXT_DMA_REPORT)
462+
MTHD_CASE(NV097_SET_SEMAPHORE_OFFSET)
463+
MTHD_CASE(NV097_BACK_END_WRITE_SEMAPHORE_RELEASE)
357464
MTHD_END();
358465
}
359466

@@ -782,6 +889,7 @@ void pgraph::Impl::reset()
782889
m_memcpy.m_instance_addr = UNBOUND_OBJ_ADDR;
783890
m_ctx_surfaces_2d.m_instance_addr = UNBOUND_OBJ_ADDR;
784891
m_kelvin.m_instance_addr = UNBOUND_OBJ_ADDR;
892+
std::fill(std::begin(m_kelvin.m_dma_obj_instance_addr), std::end(m_kelvin.m_dma_obj_instance_addr), UNBOUND_OBJ_ADDR);
785893
m_img_blit.m_instance_addr = UNBOUND_OBJ_ADDR;
786894
std::fill(std::begin(m_img_blit.m_dma_obj_instance_addr), std::end(m_img_blit.m_dma_obj_instance_addr), UNBOUND_OBJ_ADDR);
787895
}

0 commit comments

Comments
 (0)