Merge branch 'master' of git+ssh://znh@git.freedesktop.org/git/mesa/mesa into 965...
[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 struct drm_nouveau_grobj_alloc 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 } else {
38 nouveauCreateContextObject(nmesa, NvCtxSurf2D, NV04_CONTEXT_SURFACES_2D);
39 nouveauCreateContextObject(nmesa, NvCtxSurf3D, NV04_CONTEXT_SURFACES_3D);
40 }
41 if (nmesa->screen->card->type>=NV_11) {
42 nouveauCreateContextObject(nmesa, NvImageBlit, NV10_IMAGE_BLIT);
43 } else {
44 nouveauCreateContextObject(nmesa, NvImageBlit, NV_IMAGE_BLIT);
45 }
46 nouveauCreateContextObject(nmesa, NvMemFormat, NV_MEMORY_TO_MEMORY_FORMAT);
47
48 #ifdef ALLOW_MULTI_SUBCHANNEL
49 nouveauObjectOnSubchannel(nmesa, NvSubCtxSurf2D, NvCtxSurf2D);
50 BEGIN_RING_SIZE(NvSubCtxSurf2D, NV10_CONTEXT_SURFACES_2D_SET_DMA_IN_MEMORY0, 2);
51 OUT_RING(NvDmaFB);
52 OUT_RING(NvDmaFB);
53
54 nouveauObjectOnSubchannel(nmesa, NvSubImageBlit, NvImageBlit);
55 BEGIN_RING_SIZE(NvSubImageBlit, NV10_IMAGE_BLIT_SET_CONTEXT_SURFACES_2D, 1);
56 OUT_RING(NvCtxSurf2D);
57 BEGIN_RING_SIZE(NvSubImageBlit, NV10_IMAGE_BLIT_SET_OPERATION, 1);
58 OUT_RING(3); /* SRCCOPY */
59
60 nouveauObjectOnSubchannel(nmesa, NvSubMemFormat, NvMemFormat);
61 #endif
62
63 nouveauObjectOnSubchannel(nmesa, NvSub3D, Nv3D);
64 }
65
66
67