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
)
39 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
41 fb
.context
= vmesa
->hHWContext
;
42 fb
.size
= vmesa
->back
.size
;
45 if (VIA_DEBUG
) fprintf(stderr
, "context = %d, size =%d, type = %d\n", fb
.context
, fb
.size
, fb
.type
);
47 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
))
50 pFB
= vmesa
->driScreen
->pFB
;
52 vmesa
->back
.offset
= fb
.offset
;
53 vmesa
->back
.map
= (char *)(fb
.offset
+ (GLuint
)pFB
);
54 vmesa
->back
.index
= fb
.index
;
57 fprintf(stderr
, "back offset = %08x\n", vmesa
->back
.offset
);
58 fprintf(stderr
, "back index = %d\n", vmesa
->back
.index
);
61 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
67 via_alloc_front_buffer(viaContextPtr vmesa
)
72 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
74 fb
.context
= vmesa
->hHWContext
;
75 fb
.size
= vmesa
->back
.size
;
78 if (VIA_DEBUG
) fprintf(stderr
, "context = %d, size =%d, type = %d\n", fb
.context
, fb
.size
, fb
.type
);
80 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
))
83 pFB
= vmesa
->driScreen
->pFB
;
85 vmesa
->front
.offset
= fb
.offset
;
86 vmesa
->front
.map
= (char *)(fb
.offset
+ (GLuint
)pFB
);
87 vmesa
->front
.index
= fb
.index
;
90 fprintf(stderr
, "front offset = %08x\n", vmesa
->front
.offset
);
91 fprintf(stderr
, "front index = %d\n", vmesa
->front
.index
);
95 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
101 via_free_back_buffer(viaContextPtr vmesa
)
106 fb
.context
= vmesa
->hHWContext
;
107 fb
.index
= vmesa
->back
.index
;
109 ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
);
110 vmesa
->back
.map
= NULL
;
114 via_free_front_buffer(viaContextPtr vmesa
)
119 fb
.context
= vmesa
->hHWContext
;
120 fb
.index
= vmesa
->front
.index
;
122 ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
);
123 vmesa
->front
.map
= NULL
;
127 via_alloc_depth_buffer(viaContextPtr vmesa
)
132 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
134 fb
.context
= vmesa
->hHWContext
;
135 fb
.size
= vmesa
->depth
.size
;
138 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
)) {
142 pFB
= vmesa
->driScreen
->pFB
;
144 vmesa
->depth
.offset
= fb
.offset
;
145 vmesa
->depth
.map
= (char *)(fb
.offset
+ (GLuint
)pFB
);
146 vmesa
->depth
.index
= fb
.index
;
149 fprintf(stderr
, "depth offset = %08x\n", vmesa
->depth
.offset
);
150 fprintf(stderr
, "depth index = %d\n", vmesa
->depth
.index
);
153 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
159 via_free_depth_buffer(viaContextPtr vmesa
)
164 fb
.context
= vmesa
->hHWContext
;
165 fb
.index
= vmesa
->depth
.index
;
167 ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
);
168 vmesa
->depth
.map
= NULL
;
172 via_alloc_dma_buffer(viaContextPtr vmesa
)
177 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
179 vmesa
->dma
= (GLuint
*) malloc(VIA_DMA_BUFSIZ
);
182 * Check whether AGP DMA has been initialized.
185 init
.func
= VIA_DMA_INITIALIZED
;
187 ( 0 == drmCommandWrite(vmesa
->driFd
, DRM_VIA_DMA_INIT
,
188 &init
, sizeof(init
)));
190 printf("unichrome_dri.so: Using AGP.\n");
192 printf("unichrome_dri.so: Using PCI.\n");
195 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
197 return ((vmesa
->dma
) ? GL_TRUE
: GL_FALSE
);
201 via_free_dma_buffer(viaContextPtr vmesa
)
209 via_alloc_texture(viaContextPtr vmesa
, viaTextureObjectPtr t
)
213 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
215 fb
.context
= vmesa
->hHWContext
;
216 fb
.size
= t
->texMem
.size
;
220 fprintf(stderr
, "texture size = %d\n", fb
.size
);
221 fprintf(stderr
, "texture type = %d\n", fb
.type
);
224 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
)) {
225 fprintf(stderr
, "via_alloc_texture fail\n");
229 t
->texMem
.offset
= fb
.offset
;
230 t
->texMem
.index
= fb
.index
;
232 if (VIA_DEBUG
) fprintf(stderr
, "texture index = %d\n", (GLuint
)fb
.index
);
235 t
->bufAddr
= (unsigned char *)(fb
.offset
+ (GLuint
)vmesa
->driScreen
->pFB
);
237 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
241 /*=* John Sheng [2003.5.31] agp tex *=*/
243 via_alloc_texture_agp(viaContextPtr vmesa
, viaTextureObjectPtr t
)
247 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
249 fb
.context
= vmesa
->hHWContext
;
250 fb
.size
= t
->texMem
.size
;
254 fprintf(stderr
, "texture_agp size = %d\n", fb
.size
);
255 fprintf(stderr
, "texture type = %d\n", fb
.type
);
258 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
)) {
259 fprintf(stderr
, "via_alloc_texture_agp fail\n");
263 t
->texMem
.offset
= fb
.offset
;
264 t
->texMem
.index
= fb
.index
;
266 if (VIA_DEBUG
) fprintf(stderr
, "texture agp index = %d\n", (GLuint
)fb
.index
);
269 t
->bufAddr
= (unsigned char *)((GLuint
)vmesa
->viaScreen
->agpLinearStart
+ fb
.offset
);
270 /*=* John Sheng [2003.5.31] agp tex *=*/
273 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
279 via_free_texture(viaContextPtr vmesa
, viaTextureObjectPtr t
)
284 fprintf(stderr
, "via_free_texture: index = %d\n",
286 fprintf(stderr
, "via_free_texture: size = %d\n",
291 fprintf(stderr
, "!mesa\n");
295 fb
.context
= vmesa
->hHWContext
;
296 fb
.index
= t
->texMem
.index
;
298 /*=* John Sheng [2003.5.31] agp tex *=*/
304 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
)) {
305 if(vmesa
->shareCtx
) {
306 fb
.context
= ((viaContextPtr
)((GLcontext
*)(vmesa
->shareCtx
)->DriverCtx
))->hHWContext
;
307 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
)) {
308 fprintf(stderr
, "via_free_texture fail\n");
312 fprintf(stderr
, "via_free_texture fail\n");