Merge branch '965-glsl'
[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.drm.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, NV11_IMAGE_BLIT);
43 } else {
44 nouveauCreateContextObject(nmesa, NvImageBlit, NV_IMAGE_BLIT);
45 }
46 if ((nmesa->screen->card->type>=NV_10) && (nmesa->screen->card->type<NV_20)) {
47 nouveauCreateContextObject(nmesa, NvGdiRectText, NV04_GDI_RECTANGLE_TEXT);
48 nouveauCreateContextObject(nmesa, NvRasterOp, NV03_PRIMITIVE_RASTER_OP);
49 nouveauCreateContextObject(nmesa, NvPattern, NV04_IMAGE_PATTERN);
50 }
51 nouveauCreateContextObject(nmesa, NvMemFormat, NV_MEMORY_TO_MEMORY_FORMAT);
52
53 nouveauObjectOnSubchannel(nmesa, NvSubCtxSurf2D, NvCtxSurf2D);
54 BEGIN_RING_SIZE(NvSubCtxSurf2D, NV10_CONTEXT_SURFACES_2D_SET_DMA_IN_MEMORY0, 2);
55 OUT_RING(NvDmaFB);
56 OUT_RING(NvDmaFB);
57
58 nouveauObjectOnSubchannel(nmesa, NvSubImageBlit, NvImageBlit);
59 BEGIN_RING_SIZE(NvSubImageBlit, NV_IMAGE_BLIT_SET_SURFACES_2D, 1);
60 OUT_RING(NvCtxSurf2D);
61 BEGIN_RING_SIZE(NvSubImageBlit, NV_IMAGE_BLIT_OPERATION, 1);
62 OUT_RING(3); /* SRCCOPY */
63
64 if ((nmesa->screen->card->type>=NV_10) && (nmesa->screen->card->type<NV_20)) {
65 nouveauObjectOnSubchannel(nmesa, NvSubPattern, NvPattern);
66
67 BEGIN_RING_SIZE(NvSubPattern, NV04_IMAGE_PATTERN_COLOR_FORMAT, 4);
68 OUT_RING(1); /* A16R5G6B5 */
69 OUT_RING(1); /* little endian */
70 OUT_RING(0); /* 8x8 */
71 OUT_RING(1); /* monochrome */
72
73 nouveauObjectOnSubchannel(nmesa, NvSubRasterOp, NvRasterOp);
74
75 BEGIN_RING_SIZE(NvSubRasterOp, NV03_PRIMITIVE_RASTER_OP_DMA_NOTIFY, 1);
76 OUT_RING(NvSyncNotify);
77
78 nouveauObjectOnSubchannel(nmesa, NvSubGdiRectText, NvGdiRectText);
79
80 BEGIN_RING_SIZE(NvSubGdiRectText, NV04_GDI_RECTANGLE_TEXT_SET_DMA_NOTIFY, 1);
81 OUT_RING(NvSyncNotify);
82 BEGIN_RING_SIZE(NvSubGdiRectText, NV04_GDI_RECTANGLE_TEXT_PATTERN, 2);
83 OUT_RING(NvPattern);
84 OUT_RING(NvRasterOp);
85 BEGIN_RING_SIZE(NvSubGdiRectText, NV04_GDI_RECTANGLE_TEXT_SURFACE, 1);
86 OUT_RING(NvCtxSurf2D);
87 BEGIN_RING_SIZE(NvSubGdiRectText, NV04_GDI_RECTANGLE_TEXT_FORMAT, 2);
88 OUT_RING(1); /* X1R5G5B5 */
89 OUT_RING(1); /* little endian */
90 }
91
92 nouveauObjectOnSubchannel(nmesa, NvSubMemFormat, NvMemFormat);
93
94 nouveauObjectOnSubchannel(nmesa, NvSub3D, Nv3D);
95 }
96
97
98