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+
238262void 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+
253349void 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