Merge branch 'r300-swtcl'
[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,
8 uint32_t handle, int class)
9 {
10 drm_nouveau_grobj_alloc_t cto;
11 int ret;
12
13 cto.channel = nmesa->fifo.channel;
14 cto.handle = handle;
15 cto.class = class;
16 ret = drmCommandWrite(nmesa->driFd, DRM_NOUVEAU_GROBJ_ALLOC,
17 &cto, sizeof(cto));
18
19 return ret == 0;
20 }
21
22 void nouveauObjectOnSubchannel(nouveauContextPtr nmesa, int subchannel, int handle)
23 {
24 BEGIN_RING_SIZE(subchannel, 0, 1);
25 OUT_RING(handle);
26 }
27
28 void nouveauObjectInit(nouveauContextPtr nmesa)
29 {
30 #ifdef NOUVEAU_RING_DEBUG
31 return;
32 #endif
33
34 nouveauCreateContextObject(nmesa, Nv3D, nmesa->screen->card->class_3d);
35 if (nmesa->screen->card->type>=NV_10) {
36 nouveauCreateContextObject(nmesa, NvCtxSurf2D, NV10_CONTEXT_SURFACES_2D);
37 nouveauCreateContextObject(nmesa, NvImageBlit, NV10_IMAGE_BLIT);
38 } else {
39 nouveauCreateContextObject(nmesa, NvCtxSurf2D, NV04_CONTEXT_SURFACES_2D);
40 nouveauCreateContextObject(nmesa, NvCtxSurf3D, NV04_CONTEXT_SURFACES_3D);
41 nouveauCreateContextObject(nmesa, NvImageBlit, NV_IMAGE_BLIT);
42 }
43 nouveauCreateContextObject(nmesa, NvMemFormat, NV_MEMORY_TO_MEMORY_FORMAT);
44
45 #ifdef ALLOW_MULTI_SUBCHANNEL
46 nouveauObjectOnSubchannel(nmesa, NvSubCtxSurf2D, NvCtxSurf2D);
47 BEGIN_RING_SIZE(NvSubCtxSurf2D, NV10_CONTEXT_SURFACES_2D_SET_DMA_IN_MEMORY0, 2);
48 OUT_RING(NvDmaFB);
49 OUT_RING(NvDmaFB);
50
51 nouveauObjectOnSubchannel(nmesa, NvSubImageBlit, NvImageBlit);
52 BEGIN_RING_SIZE(NvSubImageBlit, NV10_IMAGE_BLIT_SET_CONTEXT_SURFACES_2D, 1);
53 OUT_RING(NvCtxSurf2D);
54 BEGIN_RING_SIZE(NvSubImageBlit, NV10_IMAGE_BLIT_SET_OPERATION, 1);
55 OUT_RING(3); /* SRCCOPY */
56
57 nouveauObjectOnSubchannel(nmesa, NvSubMemFormat, NvMemFormat);
58 #endif
59
60 nouveauObjectOnSubchannel(nmesa, NvSub3D, Nv3D);
61 }
62
63
64