nouveau: Add notifier support functions
[mesa.git] / src / mesa / drivers / dri / nouveau / nouveau_object.c
1
2 #include "nouveau_fifo.h"
3 #include "nouveau_object.h"
4 #include "nouveau_reg.h"
5
6
7 GLboolean nouveauCreateContextObject(nouveauContextPtr nmesa, int handle, int class, uint32_t flags, uint32_t dma_in, uint32_t dma_out, uint32_t dma_notifier)
8 {
9 drm_nouveau_object_init_t cto;
10 int ret;
11
12 cto.handle = handle;
13 cto.class = class;
14 cto.flags = flags;
15 cto.dma0= dma_in;
16 cto.dma1= dma_out;
17 cto.dma_notifier = dma_notifier;
18 ret = drmCommandWrite(nmesa->driFd, DRM_NOUVEAU_OBJECT_INIT, &cto, sizeof(cto));
19
20 return ret == 0;
21 }
22
23 GLboolean nouveauCreateDmaObject(nouveauContextPtr nmesa,
24 uint32_t handle,
25 uint32_t offset,
26 uint32_t size,
27 int target,
28 int access)
29 {
30 drm_nouveau_dma_object_init_t dma;
31 int ret;
32
33 dma.handle = handle;
34 dma.target = target;
35 dma.access = access;
36 dma.offset = offset;
37 dma.size = size;
38 ret = drmCommandWriteRead(nmesa->driFd, DRM_NOUVEAU_DMA_OBJECT_INIT,
39 &dma, sizeof(dma));
40 return ret == 0;
41 }
42
43 void nouveauObjectOnSubchannel(nouveauContextPtr nmesa, int subchannel, int handle)
44 {
45 BEGIN_RING_SIZE(subchannel, 0, 1);
46 OUT_RING(handle);
47 }
48
49 void nouveauObjectInit(nouveauContextPtr nmesa)
50 {
51 #ifdef NOUVEAU_RING_DEBUG
52 return;
53 #endif
54
55 /* We need to know vram size.. */
56 nouveauCreateDmaObject( nmesa, NvDmaFB,
57 0, (256*1024*1024),
58 0 /*NV_DMA_TARGET_FB*/, 0 /*NV_DMA_ACCESS_RW*/);
59
60 nouveauCreateContextObject(nmesa, Nv3D, nmesa->screen->card->class_3d,
61 0, 0, 0, 0);
62 nouveauCreateContextObject(nmesa, NvCtxSurf2D, NV10_CONTEXT_SURFACES_2D,
63 0, 0, 0, 0);
64 nouveauCreateContextObject(nmesa, NvImageBlit, NV10_IMAGE_BLIT,
65 NV_DMA_CONTEXT_FLAGS_PATCH_SRCCOPY, 0, 0, 0);
66
67 #ifdef ALLOW_MULTI_SUBCHANNEL
68 nouveauObjectOnSubchannel(nmesa, NvSubCtxSurf2D, NvCtxSurf2D);
69 BEGIN_RING_SIZE(NvSubCtxSurf2D, NV10_CONTEXT_SURFACES_2D_SET_DMA_IN_MEMORY0, 2);
70 OUT_RING(NvDmaFB);
71 OUT_RING(NvDmaFB);
72
73 nouveauObjectOnSubchannel(nmesa, NvSubImageBlit, NvImageBlit);
74 BEGIN_RING_SIZE(NvSubImageBlit, NV10_IMAGE_BLIT_SET_CONTEXT_SURFACES_2D, 1);
75 OUT_RING(NvCtxSurf2D);
76 BEGIN_RING_SIZE(NvSubImageBlit, NV10_IMAGE_BLIT_SET_OPERATION, 1);
77 OUT_RING(3); /* SRCCOPY */
78 #endif
79
80 nouveauObjectOnSubchannel(nmesa, NvSub3D, Nv3D);
81 }
82
83
84