2 * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
3 * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sub license,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19 * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
27 #include "via_context.h"
28 #include "via_ioctl.h"
31 #include <sys/ioctl.h>
34 via_alloc_back_buffer(viaContextPtr vmesa
)
38 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
39 fb
.context
= vmesa
->hHWContext
;
40 fb
.size
= vmesa
->back
.size
;
42 if (VIA_DEBUG
) fprintf(stderr
, "context = %d, size =%d, type = %d\n", fb
.context
, fb
.size
, fb
.type
);
43 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
))
46 pFB
= vmesa
->driScreen
->pFB
;
48 vmesa
->back
.offset
= fb
.offset
;
49 vmesa
->back
.map
= (char *)(fb
.offset
+ (GLuint
)pFB
);
50 vmesa
->back
.index
= fb
.index
;
52 fprintf(stderr
, "back offset = %08x\n", vmesa
->back
.offset
);
53 fprintf(stderr
, "back index = %d\n", vmesa
->back
.index
);
56 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
61 via_alloc_front_buffer(viaContextPtr vmesa
)
65 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
66 fb
.context
= vmesa
->hHWContext
;
67 fb
.size
= vmesa
->back
.size
;
69 if (VIA_DEBUG
) fprintf(stderr
, "context = %d, size =%d, type = %d\n", fb
.context
, fb
.size
, fb
.type
);
70 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
))
73 pFB
= vmesa
->driScreen
->pFB
;
75 vmesa
->front
.offset
= fb
.offset
;
76 vmesa
->front
.map
= (char *)(fb
.offset
+ (GLuint
)pFB
);
77 vmesa
->front
.index
= fb
.index
;
79 fprintf(stderr
, "front offset = %08x\n", vmesa
->front
.offset
);
80 fprintf(stderr
, "front index = %d\n", vmesa
->front
.index
);
84 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
89 via_free_back_buffer(viaContextPtr vmesa
)
94 fb
.context
= vmesa
->hHWContext
;
95 fb
.index
= vmesa
->back
.index
;
97 ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
);
98 vmesa
->back
.map
= NULL
;
102 via_free_front_buffer(viaContextPtr vmesa
)
107 fb
.context
= vmesa
->hHWContext
;
108 fb
.index
= vmesa
->front
.index
;
110 ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
);
111 vmesa
->front
.map
= NULL
;
115 via_alloc_depth_buffer(viaContextPtr vmesa
)
119 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
120 fb
.context
= vmesa
->hHWContext
;
121 fb
.size
= vmesa
->depth
.size
;
124 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
)) {
128 pFB
= vmesa
->driScreen
->pFB
;
130 vmesa
->depth
.offset
= fb
.offset
;
131 vmesa
->depth
.map
= (char *)(fb
.offset
+ (GLuint
)pFB
);
132 vmesa
->depth
.index
= fb
.index
;
134 fprintf(stderr
, "depth offset = %08x\n", vmesa
->depth
.offset
);
135 fprintf(stderr
, "depth index = %d\n", vmesa
->depth
.index
);
138 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
143 via_free_depth_buffer(viaContextPtr vmesa
)
148 fb
.context
= vmesa
->hHWContext
;
149 fb
.index
= vmesa
->depth
.index
;
151 ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
);
152 vmesa
->depth
.map
= NULL
;
156 via_alloc_dma_buffer(viaContextPtr vmesa
)
160 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
161 vmesa
->dma
= (GLuint
*) malloc(VIA_DMA_BUFSIZ
);
164 * Check whether AGP DMA has been initialized.
166 init
.func
= VIA_DMA_INITIALIZED
;
168 ( 0 == drmCommandWrite(vmesa
->driFd
, DRM_VIA_DMA_INIT
,
169 &init
, sizeof(init
)));
171 printf("unichrome_dri.so: Using AGP.\n");
173 printf("unichrome_dri.so: Using PCI.\n");
175 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
176 return ((vmesa
->dma
) ? GL_TRUE
: GL_FALSE
);
180 via_free_dma_buffer(viaContextPtr vmesa
)
188 via_alloc_texture(viaContextPtr vmesa
, viaTextureObjectPtr t
)
191 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
192 fb
.context
= vmesa
->hHWContext
;
193 fb
.size
= t
->texMem
.size
;
196 fprintf(stderr
, "texture size = %d\n", fb
.size
);
197 fprintf(stderr
, "texture type = %d\n", fb
.type
);
199 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
)) {
200 fprintf(stderr
, "via_alloc_texture fail\n");
204 t
->texMem
.offset
= fb
.offset
;
205 t
->texMem
.index
= fb
.index
;
206 if (VIA_DEBUG
) fprintf(stderr
, "texture index = %d\n", (GLuint
)fb
.index
);
208 t
->bufAddr
= (unsigned char *)(fb
.offset
+ (GLuint
)vmesa
->driScreen
->pFB
);
209 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
212 /*=* John Sheng [2003.5.31] agp tex *=*/
214 via_alloc_texture_agp(viaContextPtr vmesa
, viaTextureObjectPtr t
)
217 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
218 fb
.context
= vmesa
->hHWContext
;
219 fb
.size
= t
->texMem
.size
;
222 fprintf(stderr
, "texture_agp size = %d\n", fb
.size
);
223 fprintf(stderr
, "texture type = %d\n", fb
.type
);
225 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
)) {
226 fprintf(stderr
, "via_alloc_texture_agp fail\n");
230 t
->texMem
.offset
= fb
.offset
;
231 t
->texMem
.index
= fb
.index
;
232 if (VIA_DEBUG
) fprintf(stderr
, "texture agp index = %d\n", (GLuint
)fb
.index
);
234 t
->bufAddr
= (unsigned char *)((GLuint
)vmesa
->viaScreen
->agpLinearStart
+ fb
.offset
);
235 /*=* John Sheng [2003.5.31] agp tex *=*/
237 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
242 via_free_texture(viaContextPtr vmesa
, viaTextureObjectPtr t
)
246 fprintf(stderr
, "via_free_texture: index = %d\n",
248 fprintf(stderr
, "via_free_texture: size = %d\n",
252 fprintf(stderr
, "!mesa\n");
256 fb
.context
= vmesa
->hHWContext
;
257 fb
.index
= t
->texMem
.index
;
259 /*=* John Sheng [2003.5.31] agp tex *=*/
265 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
)) {
266 if(vmesa
->shareCtx
) {
267 fb
.context
= ((viaContextPtr
)((GLcontext
*)(vmesa
->shareCtx
)->DriverCtx
))->hHWContext
;
268 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
)) {
269 fprintf(stderr
, "via_free_texture fail\n");
273 fprintf(stderr
, "via_free_texture fail\n");