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"
30 #include <sys/ioctl.h>
33 via_alloc_back_buffer(viaContextPtr vmesa
)
38 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
40 fb
.context
= vmesa
->hHWContext
;
41 fb
.size
= vmesa
->back
.size
;
44 if (VIA_DEBUG
) fprintf(stderr
, "context = %d, size =%d, type = %d\n", fb
.context
, fb
.size
, fb
.type
);
46 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
))
49 pFB
= vmesa
->driScreen
->pFB
;
51 vmesa
->back
.offset
= fb
.offset
;
52 vmesa
->back
.map
= (char *)(fb
.offset
+ (GLuint
)pFB
);
53 vmesa
->back
.index
= fb
.index
;
56 fprintf(stderr
, "back offset = %08x\n", vmesa
->back
.offset
);
57 fprintf(stderr
, "back index = %d\n", vmesa
->back
.index
);
60 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
66 via_alloc_front_buffer(viaContextPtr vmesa
)
71 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
73 fb
.context
= vmesa
->hHWContext
;
74 fb
.size
= vmesa
->back
.size
;
77 if (VIA_DEBUG
) fprintf(stderr
, "context = %d, size =%d, type = %d\n", fb
.context
, fb
.size
, fb
.type
);
79 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
))
82 pFB
= vmesa
->driScreen
->pFB
;
84 vmesa
->front
.offset
= fb
.offset
;
85 vmesa
->front
.map
= (char *)(fb
.offset
+ (GLuint
)pFB
);
86 vmesa
->front
.index
= fb
.index
;
89 fprintf(stderr
, "front offset = %08x\n", vmesa
->front
.offset
);
90 fprintf(stderr
, "front index = %d\n", vmesa
->front
.index
);
94 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
100 via_free_back_buffer(viaContextPtr vmesa
)
105 fb
.context
= vmesa
->hHWContext
;
106 fb
.index
= vmesa
->back
.index
;
108 ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
);
109 vmesa
->back
.map
= NULL
;
113 via_free_front_buffer(viaContextPtr vmesa
)
118 fb
.context
= vmesa
->hHWContext
;
119 fb
.index
= vmesa
->front
.index
;
121 ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
);
122 vmesa
->front
.map
= NULL
;
126 via_alloc_depth_buffer(viaContextPtr vmesa
)
131 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
133 fb
.context
= vmesa
->hHWContext
;
134 fb
.size
= vmesa
->depth
.size
;
137 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
)) {
141 pFB
= vmesa
->driScreen
->pFB
;
143 vmesa
->depth
.offset
= fb
.offset
;
144 vmesa
->depth
.map
= (char *)(fb
.offset
+ (GLuint
)pFB
);
145 vmesa
->depth
.index
= fb
.index
;
148 fprintf(stderr
, "depth offset = %08x\n", vmesa
->depth
.offset
);
149 fprintf(stderr
, "depth index = %d\n", vmesa
->depth
.index
);
152 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
158 via_free_depth_buffer(viaContextPtr vmesa
)
163 fb
.context
= vmesa
->hHWContext
;
164 fb
.index
= vmesa
->depth
.index
;
166 ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
);
167 vmesa
->depth
.map
= NULL
;
171 via_alloc_dma_buffer(viaContextPtr vmesa
)
176 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
178 if (vmesa
->viaScreen
->agpLinearStart
) {
179 /* Allocate DMA in AGP memory*/
180 fb
.context
= vmesa
->hHWContext
;
181 fb
.size
= vmesa
->dma
[0].size
;
183 if (!ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
)) {
184 vmesa
->dma
[0].offset
= fb
.offset
;
185 vmesa
->dma
[0].index
= fb
.index
;
186 vmesa
->dma
[0].map
= (unsigned char *)((GLuint
)vmesa
->viaScreen
->agpLinearStart
+ fb
.offset
);
187 if (!ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
)) {
188 vmesa
->dma
[1].offset
= fb
.offset
;
189 vmesa
->dma
[1].index
= fb
.index
;
190 vmesa
->dma
[1].map
= (unsigned char *)((GLuint
)vmesa
->viaScreen
->agpLinearStart
+ fb
.offset
);
191 vmesa
->useAgp
= GL_TRUE
;
203 /* Allocate DMA in System memory */
204 dma
.size
= vmesa
->dma
[0].size
;
206 if (drmVIAAllocateDMA(vmesa
->driFd
,&dma
) < 0) {
210 vmesa
->dma
[0].offset
= 0;
211 vmesa
->dma
[0].map
= (unsigned char *)dma
.address
;
212 vmesa
->dma
[0].index
= dma
.index
;
214 drmVIAAllocateDMA(vmesa
->driFd
, &dma
);
216 vmesa
->dma
[1].offset
= 0;
217 vmesa
->dma
[1].map
= (unsigned char *)dma
.address
;
218 vmesa
->dma
[1].index
= dma
.index
;
219 vmesa
->useAgp
= GL_FALSE
;
224 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
229 via_free_dma_buffer(viaContextPtr vmesa
)
237 /* Release AGP command buffer */
239 fb
.context
= vmesa
->hHWContext
;
240 fb
.index
= vmesa
->dma
[0].index
;
242 ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
);
243 vmesa
->dma
[0].map
= NULL
;
244 fb
.index
= vmesa
->dma
[1].index
;
245 ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
);
246 vmesa
->dma
[1].map
= NULL
;
248 /* Release System command buffer */
250 /*=* John Sheng [2003.7.18] viewperf frames/sec *=*/
251 /*dma.address = (unsigned long *)vmesa->dma[0].offset;*/
252 dma
.address
= (unsigned long *)vmesa
->dma
[0].map
;
253 /*=* John Sheng [2003.6.16] fix pci path *=*/
254 dma
.size
= (unsigned int)vmesa
->dma
[0].size
;
255 drmVIAReleaseDMA(vmesa
->driFd
, &dma
);
256 /*=* John Sheng [2003.7.18] viewperf frames/sec *=*/
257 /*dma.address = (unsigned long *)vmesa->dma[1].offset;*/
258 dma
.address
= (unsigned long *)vmesa
->dma
[1].map
;
259 /*=* John Sheng [2003.6.16] fix pci path *=*/
260 dma
.size
= (unsigned int)vmesa
->dma
[1].size
;
261 drmVIAReleaseDMA(vmesa
->driFd
, &dma
);
262 /*=* John Sheng [2003.7.18] viewperf frames/sec *=*/
263 /*vmesa->dma[0].offset = 0;
264 vmesa->dma[1].offset = 0;*/
265 vmesa
->dma
[0].map
= 0;
266 vmesa
->dma
[1].map
= 0;
271 via_alloc_texture(viaContextPtr vmesa
, viaTextureObjectPtr t
)
275 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
277 fb
.context
= vmesa
->hHWContext
;
278 fb
.size
= t
->texMem
.size
;
282 fprintf(stderr
, "texture size = %d\n", fb
.size
);
283 fprintf(stderr
, "texture type = %d\n", fb
.type
);
286 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
)) {
287 fprintf(stderr
, "via_alloc_texture fail\n");
291 t
->texMem
.offset
= fb
.offset
;
292 t
->texMem
.index
= fb
.index
;
294 if (VIA_DEBUG
) fprintf(stderr
, "texture index = %d\n", (GLuint
)fb
.index
);
297 t
->bufAddr
= (unsigned char *)(fb
.offset
+ (GLuint
)vmesa
->driScreen
->pFB
);
299 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
303 /*=* John Sheng [2003.5.31] agp tex *=*/
305 via_alloc_texture_agp(viaContextPtr vmesa
, viaTextureObjectPtr t
)
309 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
311 fb
.context
= vmesa
->hHWContext
;
312 fb
.size
= t
->texMem
.size
;
316 fprintf(stderr
, "texture_agp size = %d\n", fb
.size
);
317 fprintf(stderr
, "texture type = %d\n", fb
.type
);
320 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_ALLOCMEM
, &fb
)) {
321 fprintf(stderr
, "via_alloc_texture_agp fail\n");
325 t
->texMem
.offset
= fb
.offset
;
326 t
->texMem
.index
= fb
.index
;
328 if (VIA_DEBUG
) fprintf(stderr
, "texture agp index = %d\n", (GLuint
)fb
.index
);
331 t
->bufAddr
= (unsigned char *)((GLuint
)vmesa
->viaScreen
->agpLinearStart
+ fb
.offset
);
332 /*=* John Sheng [2003.5.31] agp tex *=*/
335 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
341 via_free_texture(viaContextPtr vmesa
, viaTextureObjectPtr t
)
346 fprintf(stderr
, "via_free_texture: index = %d\n",
348 fprintf(stderr
, "via_free_texture: size = %d\n",
353 fprintf(stderr
, "!mesa\n");
357 fb
.context
= vmesa
->hHWContext
;
358 fb
.index
= t
->texMem
.index
;
360 /*=* John Sheng [2003.5.31] agp tex *=*/
366 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
)) {
367 if(vmesa
->shareCtx
) {
368 fb
.context
= ((viaContextPtr
)((GLcontext
*)(vmesa
->shareCtx
)->DriverCtx
))->hHWContext
;
369 if (ioctl(vmesa
->driFd
, DRM_IOCTL_VIA_FREEMEM
, &fb
)) {
370 fprintf(stderr
, "via_free_texture fail\n");
374 fprintf(stderr
, "via_free_texture fail\n");