2 * Copyright (C) 2009 Francisco Jerez.
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
13 * The above copyright notice and this permission notice (including the
14 * next paragraph) shall be included in all copies or substantial
15 * portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 #include "nouveau_driver.h"
28 #include "nouveau_context.h"
29 #include "nouveau_texture.h"
30 #include "nouveau_fbo.h"
31 #include "nouveau_util.h"
34 #include "main/texobj.h"
35 #include "main/texstore.h"
36 #include "main/texformat.h"
37 #include "main/texcompress.h"
38 #include "main/texgetimage.h"
39 #include "main/mipmap.h"
40 #include "main/texfetch.h"
41 #include "main/teximage.h"
42 #include "drivers/common/meta.h"
44 static struct gl_texture_object
*
45 nouveau_texture_new(struct gl_context
*ctx
, GLuint name
, GLenum target
)
47 struct nouveau_texture
*nt
= CALLOC_STRUCT(nouveau_texture
);
49 _mesa_initialize_texture_object(&nt
->base
, name
, target
);
55 nouveau_texture_free(struct gl_context
*ctx
, struct gl_texture_object
*t
)
57 struct nouveau_texture
*nt
= to_nouveau_texture(t
);
60 for (i
= 0; i
< MAX_TEXTURE_LEVELS
; i
++)
61 nouveau_surface_ref(NULL
, &nt
->surfaces
[i
]);
63 _mesa_delete_texture_object(ctx
, t
);
66 static struct gl_texture_image
*
67 nouveau_teximage_new(struct gl_context
*ctx
)
69 struct nouveau_teximage
*nti
= CALLOC_STRUCT(nouveau_teximage
);
75 nouveau_teximage_free(struct gl_context
*ctx
, struct gl_texture_image
*ti
)
77 struct nouveau_teximage
*nti
= to_nouveau_teximage(ti
);
79 nouveau_surface_ref(NULL
, &nti
->surface
);
83 nouveau_teximage_map(struct gl_context
*ctx
, struct gl_texture_image
*ti
,
84 int access
, int x
, int y
, int w
, int h
)
86 struct nouveau_teximage
*nti
= to_nouveau_teximage(ti
);
87 struct nouveau_surface
*s
= &nti
->surface
;
88 struct nouveau_surface
*st
= &nti
->transfer
.surface
;
91 if (!(access
& GL_MAP_READ_BIT
) &&
92 nouveau_bo_pending(s
->bo
)) {
94 * Heuristic: use a bounce buffer to pipeline
98 st
->format
= s
->format
;
102 st
->pitch
= s
->pitch
;
106 ti
->Data
= nouveau_get_scratch(ctx
, st
->pitch
* h
,
107 &st
->bo
, &st
->offset
);
112 if (access
& GL_MAP_READ_BIT
)
113 flags
|= NOUVEAU_BO_RD
;
114 if (access
& GL_MAP_WRITE_BIT
)
115 flags
|= NOUVEAU_BO_WR
;
118 ret
= nouveau_bo_map(s
->bo
, flags
);
122 ti
->Data
= s
->bo
->map
+ y
* s
->pitch
+ x
* s
->cpp
;
128 nouveau_teximage_unmap(struct gl_context
*ctx
, struct gl_texture_image
*ti
)
130 struct nouveau_teximage
*nti
= to_nouveau_teximage(ti
);
131 struct nouveau_surface
*s
= &nti
->surface
;
132 struct nouveau_surface
*st
= &nti
->transfer
.surface
;
135 context_drv(ctx
)->surface_copy(ctx
, s
, st
, nti
->transfer
.x
,
136 nti
->transfer
.y
, 0, 0,
137 st
->width
, st
->height
);
138 nouveau_surface_ref(NULL
, st
);
141 nouveau_bo_unmap(s
->bo
);
149 nouveau_map_texture_image(struct gl_context
*ctx
,
150 struct gl_texture_image
*ti
,
152 GLuint x
, GLuint y
, GLuint w
, GLuint h
,
157 struct nouveau_teximage
*nti
= to_nouveau_teximage(ti
);
158 struct nouveau_surface
*s
= &nti
->surface
;
159 struct nouveau_surface
*st
= &nti
->transfer
.surface
;
161 /* Nouveau has no support for 3D or cubemap textures. */
165 if (!(mode
& GL_MAP_READ_BIT
) &&
166 nouveau_bo_pending(s
->bo
)) {
168 * Heuristic: use a bounce buffer to pipeline
169 * teximage transfers.
172 st
->format
= s
->format
;
176 st
->pitch
= s
->pitch
;
180 *map
= nouveau_get_scratch(ctx
, st
->pitch
* h
,
181 &st
->bo
, &st
->offset
);
186 if (mode
& GL_MAP_READ_BIT
)
187 flags
|= NOUVEAU_BO_RD
;
188 if (mode
& GL_MAP_WRITE_BIT
)
189 flags
|= NOUVEAU_BO_WR
;
192 ret
= nouveau_bo_map(s
->bo
, flags
);
196 *map
= s
->bo
->map
+ y
* s
->pitch
+ x
* s
->cpp
;
200 *map
= ti
->Data
+ y
* s
->pitch
+ x
* s
->cpp
;
206 nouveau_unmap_texture_image(struct gl_context
*ctx
, struct gl_texture_image
*ti
,
209 struct nouveau_teximage
*nti
= to_nouveau_teximage(ti
);
210 struct nouveau_surface
*s
= &nti
->surface
;
211 struct nouveau_surface
*st
= &nti
->transfer
.surface
;
214 context_drv(ctx
)->surface_copy(ctx
, s
, st
, nti
->transfer
.x
,
215 nti
->transfer
.y
, 0, 0,
216 st
->width
, st
->height
);
217 nouveau_surface_ref(NULL
, st
);
220 nouveau_bo_unmap(s
->bo
);
227 nouveau_choose_tex_format(struct gl_context
*ctx
, GLint internalFormat
,
228 GLenum srcFormat
, GLenum srcType
)
230 switch (internalFormat
) {
239 case GL_COMPRESSED_RGBA
:
240 return MESA_FORMAT_ARGB8888
;
242 return MESA_FORMAT_ARGB1555
;
249 case GL_COMPRESSED_RGB
:
250 return MESA_FORMAT_XRGB8888
;
255 return MESA_FORMAT_RGB565
;
258 case GL_LUMINANCE_ALPHA
:
259 case GL_LUMINANCE4_ALPHA4
:
260 case GL_LUMINANCE6_ALPHA2
:
261 case GL_LUMINANCE12_ALPHA4
:
262 case GL_LUMINANCE12_ALPHA12
:
263 case GL_LUMINANCE16_ALPHA16
:
264 case GL_LUMINANCE8_ALPHA8
:
265 case GL_COMPRESSED_LUMINANCE_ALPHA
:
266 return MESA_FORMAT_ARGB8888
;
274 case GL_COMPRESSED_LUMINANCE
:
275 return MESA_FORMAT_L8
;
282 case GL_COMPRESSED_ALPHA
:
283 return MESA_FORMAT_A8
;
290 return MESA_FORMAT_I8
;
293 case GL_COLOR_INDEX1_EXT
:
294 case GL_COLOR_INDEX2_EXT
:
295 case GL_COLOR_INDEX4_EXT
:
296 case GL_COLOR_INDEX12_EXT
:
297 case GL_COLOR_INDEX16_EXT
:
298 case GL_COLOR_INDEX8_EXT
:
299 return MESA_FORMAT_CI8
;
307 teximage_fits(struct gl_texture_object
*t
, int level
)
309 struct nouveau_surface
*s
= &to_nouveau_texture(t
)->surfaces
[level
];
310 struct gl_texture_image
*ti
= t
->Image
[0][level
];
312 if (!ti
|| !to_nouveau_teximage(ti
)->surface
.bo
)
315 if (level
== t
->BaseLevel
&& (s
->offset
& 0x7f))
318 return t
->Target
== GL_TEXTURE_RECTANGLE
||
319 (s
->bo
&& s
->format
== ti
->TexFormat
&&
320 s
->width
== ti
->Width
&& s
->height
== ti
->Height
);
324 validate_teximage(struct gl_context
*ctx
, struct gl_texture_object
*t
,
325 int level
, int x
, int y
, int z
,
326 int width
, int height
, int depth
)
328 struct gl_texture_image
*ti
= t
->Image
[0][level
];
330 if (teximage_fits(t
, level
)) {
331 struct nouveau_surface
*ss
= to_nouveau_texture(t
)->surfaces
;
332 struct nouveau_surface
*s
= &to_nouveau_teximage(ti
)->surface
;
334 if (t
->Target
== GL_TEXTURE_RECTANGLE
)
335 nouveau_surface_ref(s
, &ss
[level
]);
337 context_drv(ctx
)->surface_copy(ctx
, &ss
[level
], s
,
348 get_last_level(struct gl_texture_object
*t
)
350 struct gl_texture_image
*base
= t
->Image
[0][t
->BaseLevel
];
352 if (t
->Sampler
.MinFilter
== GL_NEAREST
||
353 t
->Sampler
.MinFilter
== GL_LINEAR
|| !base
)
356 return MIN2(t
->BaseLevel
+ base
->MaxLog2
, t
->MaxLevel
);
360 relayout_texture(struct gl_context
*ctx
, struct gl_texture_object
*t
)
362 struct gl_texture_image
*base
= t
->Image
[0][t
->BaseLevel
];
364 if (base
&& t
->Target
!= GL_TEXTURE_RECTANGLE
) {
365 struct nouveau_surface
*ss
= to_nouveau_texture(t
)->surfaces
;
366 struct nouveau_surface
*s
= &to_nouveau_teximage(base
)->surface
;
367 int i
, ret
, last
= get_last_level(t
);
368 unsigned size
, offset
= 0,
372 /* Deallocate the old storage. */
373 for (i
= 0; i
< MAX_TEXTURE_LEVELS
; i
++)
374 nouveau_bo_ref(NULL
, &ss
[i
].bo
);
376 /* Relayout the mipmap tree. */
377 for (i
= t
->BaseLevel
; i
<= last
; i
++) {
378 size
= width
* height
* s
->cpp
;
380 /* Images larger than 16B have to be aligned. */
382 offset
= align(offset
, 64);
384 ss
[i
] = (struct nouveau_surface
) {
391 .pitch
= width
* s
->cpp
,
395 width
= MAX2(1, width
/ 2);
396 height
= MAX2(1, height
/ 2);
399 /* Get new storage. */
400 size
= align(offset
, 64);
402 ret
= nouveau_bo_new(context_dev(ctx
), NOUVEAU_BO_MAP
|
403 NOUVEAU_BO_GART
| NOUVEAU_BO_VRAM
,
404 0, size
, &ss
[last
].bo
);
407 for (i
= t
->BaseLevel
; i
< last
; i
++)
408 nouveau_bo_ref(ss
[last
].bo
, &ss
[i
].bo
);
413 nouveau_texture_validate(struct gl_context
*ctx
, struct gl_texture_object
*t
)
415 struct nouveau_texture
*nt
= to_nouveau_texture(t
);
416 int i
, last
= get_last_level(t
);
418 if (!teximage_fits(t
, t
->BaseLevel
) ||
419 !teximage_fits(t
, last
))
423 nt
->dirty
= GL_FALSE
;
425 /* Copy the teximages to the actual miptree. */
426 for (i
= t
->BaseLevel
; i
<= last
; i
++) {
427 struct nouveau_surface
*s
= &nt
->surfaces
[i
];
429 validate_teximage(ctx
, t
, i
, 0, 0, 0,
430 s
->width
, s
->height
, 1);
433 FIRE_RING(context_chan(ctx
));
440 nouveau_texture_reallocate(struct gl_context
*ctx
, struct gl_texture_object
*t
)
442 if (!teximage_fits(t
, t
->BaseLevel
) ||
443 !teximage_fits(t
, get_last_level(t
))) {
445 relayout_texture(ctx
, t
);
446 nouveau_texture_validate(ctx
, t
);
451 get_teximage_placement(struct gl_texture_image
*ti
)
453 if (ti
->TexFormat
== MESA_FORMAT_A8
||
454 ti
->TexFormat
== MESA_FORMAT_L8
||
455 ti
->TexFormat
== MESA_FORMAT_I8
)
456 /* 1 cpp formats will have to be swizzled by the CPU,
457 * so leave them in system RAM for now. */
458 return NOUVEAU_BO_MAP
;
460 return NOUVEAU_BO_GART
| NOUVEAU_BO_MAP
;
464 nouveau_teximage(struct gl_context
*ctx
, GLint dims
, GLenum target
, GLint level
,
465 GLint internalFormat
,
466 GLint width
, GLint height
, GLint depth
, GLint border
,
467 GLenum format
, GLenum type
, const GLvoid
*pixels
,
468 const struct gl_pixelstore_attrib
*packing
,
469 struct gl_texture_object
*t
,
470 struct gl_texture_image
*ti
)
472 struct nouveau_surface
*s
= &to_nouveau_teximage(ti
)->surface
;
475 /* Allocate a new bo for the image. */
476 nouveau_surface_alloc(ctx
, s
, LINEAR
, get_teximage_placement(ti
),
477 ti
->TexFormat
, width
, height
);
478 ti
->RowStride
= s
->pitch
/ s
->cpp
;
480 pixels
= _mesa_validate_pbo_teximage(ctx
, dims
, width
, height
, depth
,
481 format
, type
, pixels
, packing
,
484 /* Store the pixel data. */
485 nouveau_teximage_map(ctx
, ti
, GL_MAP_WRITE_BIT
,
486 0, 0, width
, height
);
488 ret
= _mesa_texstore(ctx
, dims
, ti
->_BaseFormat
,
489 ti
->TexFormat
, ti
->Data
,
492 width
, height
, depth
,
493 format
, type
, pixels
, packing
);
496 nouveau_teximage_unmap(ctx
, ti
);
497 _mesa_unmap_teximage_pbo(ctx
, packing
);
499 if (!validate_teximage(ctx
, t
, level
, 0, 0, 0,
500 width
, height
, depth
))
501 /* It doesn't fit, mark it as dirty. */
505 if (level
== t
->BaseLevel
) {
506 if (!teximage_fits(t
, level
))
507 relayout_texture(ctx
, t
);
508 nouveau_texture_validate(ctx
, t
);
511 context_dirty_i(ctx
, TEX_OBJ
, ctx
->Texture
.CurrentUnit
);
512 context_dirty_i(ctx
, TEX_ENV
, ctx
->Texture
.CurrentUnit
);
516 nouveau_teximage_1d(struct gl_context
*ctx
, GLenum target
, GLint level
,
517 GLint internalFormat
,
518 GLint width
, GLint border
,
519 GLenum format
, GLenum type
, const GLvoid
*pixels
,
520 const struct gl_pixelstore_attrib
*packing
,
521 struct gl_texture_object
*t
,
522 struct gl_texture_image
*ti
)
524 nouveau_teximage(ctx
, 1, target
, level
, internalFormat
,
525 width
, 1, 1, border
, format
, type
, pixels
,
530 nouveau_teximage_2d(struct gl_context
*ctx
, GLenum target
, GLint level
,
531 GLint internalFormat
,
532 GLint width
, GLint height
, GLint border
,
533 GLenum format
, GLenum type
, const GLvoid
*pixels
,
534 const struct gl_pixelstore_attrib
*packing
,
535 struct gl_texture_object
*t
,
536 struct gl_texture_image
*ti
)
538 nouveau_teximage(ctx
, 2, target
, level
, internalFormat
,
539 width
, height
, 1, border
, format
, type
, pixels
,
544 nouveau_teximage_3d(struct gl_context
*ctx
, GLenum target
, GLint level
,
545 GLint internalFormat
,
546 GLint width
, GLint height
, GLint depth
, GLint border
,
547 GLenum format
, GLenum type
, const GLvoid
*pixels
,
548 const struct gl_pixelstore_attrib
*packing
,
549 struct gl_texture_object
*t
,
550 struct gl_texture_image
*ti
)
552 nouveau_teximage(ctx
, 3, target
, level
, internalFormat
,
553 width
, height
, depth
, border
, format
, type
, pixels
,
558 nouveau_texsubimage(struct gl_context
*ctx
, GLint dims
, GLenum target
, GLint level
,
559 GLint xoffset
, GLint yoffset
, GLint zoffset
,
560 GLint width
, GLint height
, GLint depth
,
561 GLenum format
, GLenum type
, const void *pixels
,
562 const struct gl_pixelstore_attrib
*packing
,
563 struct gl_texture_object
*t
,
564 struct gl_texture_image
*ti
)
566 struct nouveau_surface
*s
= &to_nouveau_teximage(ti
)->surface
;
569 pixels
= _mesa_validate_pbo_teximage(ctx
, dims
, width
, height
, depth
,
570 format
, type
, pixels
, packing
,
573 nouveau_teximage_map(ctx
, ti
, GL_MAP_WRITE_BIT
,
574 xoffset
, yoffset
, width
, height
);
576 ret
= _mesa_texstore(ctx
, 3, ti
->_BaseFormat
, ti
->TexFormat
,
577 ti
->Data
, 0, 0, 0, s
->pitch
,
578 ti
->ImageOffsets
, width
, height
, depth
,
579 format
, type
, pixels
, packing
);
582 nouveau_teximage_unmap(ctx
, ti
);
583 _mesa_unmap_teximage_pbo(ctx
, packing
);
586 if (!to_nouveau_texture(t
)->dirty
)
587 validate_teximage(ctx
, t
, level
, xoffset
, yoffset
, zoffset
,
588 width
, height
, depth
);
592 nouveau_texsubimage_3d(struct gl_context
*ctx
, GLenum target
, GLint level
,
593 GLint xoffset
, GLint yoffset
, GLint zoffset
,
594 GLint width
, GLint height
, GLint depth
,
595 GLenum format
, GLenum type
, const void *pixels
,
596 const struct gl_pixelstore_attrib
*packing
,
597 struct gl_texture_object
*t
,
598 struct gl_texture_image
*ti
)
600 nouveau_texsubimage(ctx
, 3, target
, level
, xoffset
, yoffset
, zoffset
,
601 width
, height
, depth
, format
, type
, pixels
,
606 nouveau_texsubimage_2d(struct gl_context
*ctx
, GLenum target
, GLint level
,
607 GLint xoffset
, GLint yoffset
,
608 GLint width
, GLint height
,
609 GLenum format
, GLenum type
, const void *pixels
,
610 const struct gl_pixelstore_attrib
*packing
,
611 struct gl_texture_object
*t
,
612 struct gl_texture_image
*ti
)
614 nouveau_texsubimage(ctx
, 2, target
, level
, xoffset
, yoffset
, 0,
615 width
, height
, 1, format
, type
, pixels
,
620 nouveau_texsubimage_1d(struct gl_context
*ctx
, GLenum target
, GLint level
,
621 GLint xoffset
, GLint width
,
622 GLenum format
, GLenum type
, const void *pixels
,
623 const struct gl_pixelstore_attrib
*packing
,
624 struct gl_texture_object
*t
,
625 struct gl_texture_image
*ti
)
627 nouveau_texsubimage(ctx
, 1, target
, level
, xoffset
, 0, 0,
628 width
, 1, 1, format
, type
, pixels
,
633 nouveau_get_teximage(struct gl_context
*ctx
, GLenum target
, GLint level
,
634 GLenum format
, GLenum type
, GLvoid
*pixels
,
635 struct gl_texture_object
*t
,
636 struct gl_texture_image
*ti
)
638 nouveau_teximage_map(ctx
, ti
, GL_MAP_READ_BIT
,
639 0, 0, ti
->Width
, ti
->Height
);
640 _mesa_get_teximage(ctx
, target
, level
, format
, type
, pixels
,
642 nouveau_teximage_unmap(ctx
, ti
);
646 nouveau_bind_texture(struct gl_context
*ctx
, GLenum target
,
647 struct gl_texture_object
*t
)
649 context_dirty_i(ctx
, TEX_OBJ
, ctx
->Texture
.CurrentUnit
);
650 context_dirty_i(ctx
, TEX_ENV
, ctx
->Texture
.CurrentUnit
);
654 get_texbuffer_format(struct gl_renderbuffer
*rb
, GLint format
)
656 struct nouveau_surface
*s
= &to_nouveau_renderbuffer(rb
)->surface
;
660 else if (format
== __DRI_TEXTURE_FORMAT_RGBA
)
661 return MESA_FORMAT_ARGB8888
;
663 return MESA_FORMAT_XRGB8888
;
667 nouveau_set_texbuffer(__DRIcontext
*dri_ctx
,
668 GLint target
, GLint format
,
671 struct nouveau_context
*nctx
= dri_ctx
->driverPrivate
;
672 struct gl_context
*ctx
= &nctx
->base
;
673 struct gl_framebuffer
*fb
= draw
->driverPrivate
;
674 struct gl_renderbuffer
*rb
=
675 fb
->Attachment
[BUFFER_FRONT_LEFT
].Renderbuffer
;
676 struct gl_texture_object
*t
= _mesa_get_current_tex_object(ctx
, target
);
677 struct gl_texture_image
*ti
;
678 struct nouveau_surface
*s
;
680 _mesa_lock_texture(ctx
, t
);
681 ti
= _mesa_get_tex_image(ctx
, t
, target
, 0);
682 s
= &to_nouveau_teximage(ti
)->surface
;
684 /* Update the texture surface with the given drawable. */
685 nouveau_update_renderbuffers(dri_ctx
, draw
);
686 nouveau_surface_ref(&to_nouveau_renderbuffer(rb
)->surface
, s
);
688 s
->format
= get_texbuffer_format(rb
, format
);
690 /* Update the image fields. */
691 _mesa_init_teximage_fields(ctx
, target
, ti
, s
->width
, s
->height
,
692 1, 0, s
->cpp
, s
->format
);
693 ti
->RowStride
= s
->pitch
/ s
->cpp
;
695 /* Try to validate it. */
696 if (!validate_teximage(ctx
, t
, 0, 0, 0, 0, s
->width
, s
->height
, 1))
697 nouveau_texture_reallocate(ctx
, t
);
699 context_dirty_i(ctx
, TEX_OBJ
, ctx
->Texture
.CurrentUnit
);
700 context_dirty_i(ctx
, TEX_ENV
, ctx
->Texture
.CurrentUnit
);
702 _mesa_unlock_texture(ctx
, t
);
706 nouveau_texture_map(struct gl_context
*ctx
, struct gl_texture_object
*t
)
710 for (i
= t
->BaseLevel
; i
< t
->_MaxLevel
; i
++) {
711 struct gl_texture_image
*ti
= t
->Image
[0][i
];
714 nouveau_teximage_map(ctx
, ti
, GL_MAP_READ_BIT
,
715 0, 0, ti
->Width
, ti
->Height
);
720 nouveau_texture_unmap(struct gl_context
*ctx
, struct gl_texture_object
*t
)
724 for (i
= t
->BaseLevel
; i
< t
->_MaxLevel
; i
++) {
726 nouveau_teximage_unmap(ctx
, t
->Image
[0][i
]);
731 store_mipmap(struct gl_context
*ctx
, GLenum target
, int first
, int last
,
732 struct gl_texture_object
*t
)
734 struct gl_pixelstore_attrib packing
= {
735 .BufferObj
= ctx
->Shared
->NullBufferObj
,
738 GLenum format
= t
->Image
[0][t
->BaseLevel
]->TexFormat
;
739 unsigned base_format
, type
, comps
;
742 base_format
= _mesa_get_format_base_format(format
);
743 _mesa_format_to_type_and_comps(format
, &type
, &comps
);
745 for (i
= first
; i
<= last
; i
++) {
746 struct gl_texture_image
*ti
= t
->Image
[0][i
];
747 void *data
= ti
->Data
;
749 nouveau_teximage(ctx
, 3, target
, i
, ti
->InternalFormat
,
750 ti
->Width
, ti
->Height
, ti
->Depth
,
751 ti
->Border
, base_format
, type
, data
,
754 _mesa_free_texmemory(data
);
759 nouveau_generate_mipmap(struct gl_context
*ctx
, GLenum target
,
760 struct gl_texture_object
*t
)
762 if (_mesa_meta_check_generate_mipmap_fallback(ctx
, target
, t
)) {
763 struct gl_texture_image
*base
= t
->Image
[0][t
->BaseLevel
];
765 nouveau_teximage_map(ctx
, base
, GL_MAP_READ_BIT
,
766 0, 0, base
->Width
, base
->Height
);
767 _mesa_generate_mipmap(ctx
, target
, t
);
768 nouveau_teximage_unmap(ctx
, base
);
770 if (!_mesa_is_format_compressed(base
->TexFormat
)) {
771 store_mipmap(ctx
, target
, t
->BaseLevel
+ 1,
772 get_last_level(t
), t
);
776 _mesa_meta_GenerateMipmap(ctx
, target
, t
);
781 nouveau_texture_functions_init(struct dd_function_table
*functions
)
783 functions
->NewTextureObject
= nouveau_texture_new
;
784 functions
->DeleteTexture
= nouveau_texture_free
;
785 functions
->NewTextureImage
= nouveau_teximage_new
;
786 functions
->FreeTextureImageBuffer
= nouveau_teximage_free
;
787 functions
->ChooseTextureFormat
= nouveau_choose_tex_format
;
788 functions
->TexImage1D
= nouveau_teximage_1d
;
789 functions
->TexImage2D
= nouveau_teximage_2d
;
790 functions
->TexImage3D
= nouveau_teximage_3d
;
791 functions
->TexSubImage1D
= nouveau_texsubimage_1d
;
792 functions
->TexSubImage2D
= nouveau_texsubimage_2d
;
793 functions
->TexSubImage3D
= nouveau_texsubimage_3d
;
794 functions
->GetTexImage
= nouveau_get_teximage
;
795 functions
->BindTexture
= nouveau_bind_texture
;
796 functions
->MapTexture
= nouveau_texture_map
;
797 functions
->UnmapTexture
= nouveau_texture_unmap
;
798 functions
->MapTextureImage
= nouveau_map_texture_image
;
799 functions
->UnmapTextureImage
= nouveau_unmap_texture_image
;
800 functions
->GenerateMipmap
= nouveau_generate_mipmap
;