• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************
2  *
3  * Copyright 2007 VMware, Inc.
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sub license, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice (including the
15  * next paragraph) shall be included in all copies or substantial portions
16  * of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25  *
26  **************************************************************************/
27 
28 #include <stdio.h>
29 #include "main/bufferobj.h"
30 #include "main/enums.h"
31 #include "main/fbobject.h"
32 #include "main/formats.h"
33 #include "main/format_utils.h"
34 #include "main/glformats.h"
35 #include "main/image.h"
36 #include "main/imports.h"
37 #include "main/macros.h"
38 #include "main/mipmap.h"
39 #include "main/pack.h"
40 #include "main/pbo.h"
41 #include "main/pixeltransfer.h"
42 #include "main/texcompress.h"
43 #include "main/texcompress_etc.h"
44 #include "main/texgetimage.h"
45 #include "main/teximage.h"
46 #include "main/texobj.h"
47 #include "main/texstore.h"
48 
49 #include "state_tracker/st_debug.h"
50 #include "state_tracker/st_context.h"
51 #include "state_tracker/st_cb_bitmap.h"
52 #include "state_tracker/st_cb_fbo.h"
53 #include "state_tracker/st_cb_flush.h"
54 #include "state_tracker/st_cb_texture.h"
55 #include "state_tracker/st_cb_bufferobjects.h"
56 #include "state_tracker/st_cb_memoryobjects.h"
57 #include "state_tracker/st_format.h"
58 #include "state_tracker/st_pbo.h"
59 #include "state_tracker/st_texture.h"
60 #include "state_tracker/st_gen_mipmap.h"
61 #include "state_tracker/st_atom.h"
62 #include "state_tracker/st_sampler_view.h"
63 
64 #include "pipe/p_context.h"
65 #include "pipe/p_defines.h"
66 #include "util/u_inlines.h"
67 #include "util/u_upload_mgr.h"
68 #include "pipe/p_shader_tokens.h"
69 #include "util/u_tile.h"
70 #include "util/u_format.h"
71 #include "util/u_surface.h"
72 #include "util/u_sampler.h"
73 #include "util/u_math.h"
74 #include "util/u_box.h"
75 #include "util/u_simple_shaders.h"
76 #include "cso_cache/cso_context.h"
77 #include "tgsi/tgsi_ureg.h"
78 
79 #define DBG if (0) printf
80 
81 
82 enum pipe_texture_target
gl_target_to_pipe(GLenum target)83 gl_target_to_pipe(GLenum target)
84 {
85    switch (target) {
86    case GL_TEXTURE_1D:
87    case GL_PROXY_TEXTURE_1D:
88       return PIPE_TEXTURE_1D;
89    case GL_TEXTURE_2D:
90    case GL_PROXY_TEXTURE_2D:
91    case GL_TEXTURE_EXTERNAL_OES:
92    case GL_TEXTURE_2D_MULTISAMPLE:
93    case GL_PROXY_TEXTURE_2D_MULTISAMPLE:
94       return PIPE_TEXTURE_2D;
95    case GL_TEXTURE_RECTANGLE_NV:
96    case GL_PROXY_TEXTURE_RECTANGLE_NV:
97       return PIPE_TEXTURE_RECT;
98    case GL_TEXTURE_3D:
99    case GL_PROXY_TEXTURE_3D:
100       return PIPE_TEXTURE_3D;
101    case GL_TEXTURE_CUBE_MAP_ARB:
102    case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
103    case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
104    case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
105    case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
106    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
107    case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
108    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
109       return PIPE_TEXTURE_CUBE;
110    case GL_TEXTURE_1D_ARRAY_EXT:
111    case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
112       return PIPE_TEXTURE_1D_ARRAY;
113    case GL_TEXTURE_2D_ARRAY_EXT:
114    case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
115    case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
116    case GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY:
117       return PIPE_TEXTURE_2D_ARRAY;
118    case GL_TEXTURE_BUFFER:
119       return PIPE_BUFFER;
120    case GL_TEXTURE_CUBE_MAP_ARRAY:
121    case GL_PROXY_TEXTURE_CUBE_MAP_ARRAY:
122       return PIPE_TEXTURE_CUBE_ARRAY;
123    default:
124       assert(0);
125       return 0;
126    }
127 }
128 
129 
130 /** called via ctx->Driver.NewTextureImage() */
131 static struct gl_texture_image *
st_NewTextureImage(struct gl_context * ctx)132 st_NewTextureImage(struct gl_context * ctx)
133 {
134    DBG("%s\n", __func__);
135    (void) ctx;
136    return (struct gl_texture_image *) ST_CALLOC_STRUCT(st_texture_image);
137 }
138 
139 
140 /** called via ctx->Driver.DeleteTextureImage() */
141 static void
st_DeleteTextureImage(struct gl_context * ctx,struct gl_texture_image * img)142 st_DeleteTextureImage(struct gl_context * ctx, struct gl_texture_image *img)
143 {
144    /* nothing special (yet) for st_texture_image */
145    _mesa_delete_texture_image(ctx, img);
146 }
147 
148 
149 /** called via ctx->Driver.NewTextureObject() */
150 static struct gl_texture_object *
st_NewTextureObject(struct gl_context * ctx,GLuint name,GLenum target)151 st_NewTextureObject(struct gl_context * ctx, GLuint name, GLenum target)
152 {
153    struct st_texture_object *obj = ST_CALLOC_STRUCT(st_texture_object);
154    if (!obj)
155       return NULL;
156 
157    /* Pre-allocate a sampler views container to save a branch in the fast path. */
158    obj->sampler_views = calloc(1, sizeof(struct st_sampler_views) + sizeof(struct st_sampler_view));
159    if (!obj->sampler_views) {
160       free(obj);
161       return NULL;
162    }
163    obj->sampler_views->max = 1;
164 
165    DBG("%s\n", __func__);
166    _mesa_initialize_texture_object(ctx, &obj->base, name, target);
167 
168    simple_mtx_init(&obj->validate_mutex, mtx_plain);
169    obj->needs_validation = true;
170 
171    return &obj->base;
172 }
173 
174 /** called via ctx->Driver.DeleteTextureObject() */
175 static void
st_DeleteTextureObject(struct gl_context * ctx,struct gl_texture_object * texObj)176 st_DeleteTextureObject(struct gl_context *ctx,
177                        struct gl_texture_object *texObj)
178 {
179    struct st_context *st = st_context(ctx);
180    struct st_texture_object *stObj = st_texture_object(texObj);
181 
182    pipe_resource_reference(&stObj->pt, NULL);
183    st_texture_release_all_sampler_views(st, stObj);
184    st_texture_free_sampler_views(stObj);
185    simple_mtx_destroy(&stObj->validate_mutex);
186    _mesa_delete_texture_object(ctx, texObj);
187 }
188 
189 
190 /** called via ctx->Driver.FreeTextureImageBuffer() */
191 static void
st_FreeTextureImageBuffer(struct gl_context * ctx,struct gl_texture_image * texImage)192 st_FreeTextureImageBuffer(struct gl_context *ctx,
193                           struct gl_texture_image *texImage)
194 {
195    struct st_context *st = st_context(ctx);
196    struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
197    struct st_texture_image *stImage = st_texture_image(texImage);
198 
199    DBG("%s\n", __func__);
200 
201    if (stImage->pt) {
202       pipe_resource_reference(&stImage->pt, NULL);
203    }
204 
205    free(stImage->transfer);
206    stImage->transfer = NULL;
207    stImage->num_transfers = 0;
208 
209    if (stImage->etc_data) {
210       free(stImage->etc_data);
211       stImage->etc_data = NULL;
212    }
213 
214    /* if the texture image is being deallocated, the structure of the
215     * texture is changing so we'll likely need a new sampler view.
216     */
217    st_texture_release_all_sampler_views(st, stObj);
218 }
219 
220 bool
st_etc_fallback(struct st_context * st,struct gl_texture_image * texImage)221 st_etc_fallback(struct st_context *st, struct gl_texture_image *texImage)
222 {
223    return (_mesa_is_format_etc2(texImage->TexFormat) && !st->has_etc2) ||
224           (texImage->TexFormat == MESA_FORMAT_ETC1_RGB8 && !st->has_etc1);
225 }
226 
227 static void
etc_fallback_allocate(struct st_context * st,struct st_texture_image * stImage)228 etc_fallback_allocate(struct st_context *st, struct st_texture_image *stImage)
229 {
230    struct gl_texture_image *texImage = &stImage->base;
231 
232    if (!st_etc_fallback(st, texImage))
233       return;
234 
235    if (stImage->etc_data)
236       free(stImage->etc_data);
237 
238    unsigned data_size = _mesa_format_image_size(texImage->TexFormat,
239                                                 texImage->Width2,
240                                                 texImage->Height2,
241                                                 texImage->Depth2);
242 
243    stImage->etc_data =
244       malloc(data_size * _mesa_num_tex_faces(texImage->TexObject->Target));
245 }
246 
247 /** called via ctx->Driver.MapTextureImage() */
248 static void
st_MapTextureImage(struct gl_context * ctx,struct gl_texture_image * texImage,GLuint slice,GLuint x,GLuint y,GLuint w,GLuint h,GLbitfield mode,GLubyte ** mapOut,GLint * rowStrideOut)249 st_MapTextureImage(struct gl_context *ctx,
250                    struct gl_texture_image *texImage,
251                    GLuint slice, GLuint x, GLuint y, GLuint w, GLuint h,
252                    GLbitfield mode,
253                    GLubyte **mapOut, GLint *rowStrideOut)
254 {
255    struct st_context *st = st_context(ctx);
256    struct st_texture_image *stImage = st_texture_image(texImage);
257    unsigned pipeMode;
258    GLubyte *map;
259    struct pipe_transfer *transfer;
260 
261    pipeMode = 0x0;
262    if (mode & GL_MAP_READ_BIT)
263       pipeMode |= PIPE_TRANSFER_READ;
264    if (mode & GL_MAP_WRITE_BIT)
265       pipeMode |= PIPE_TRANSFER_WRITE;
266    if (mode & GL_MAP_INVALIDATE_RANGE_BIT)
267       pipeMode |= PIPE_TRANSFER_DISCARD_RANGE;
268 
269    map = st_texture_image_map(st, stImage, pipeMode, x, y, slice, w, h, 1,
270                               &transfer);
271    if (map) {
272       if (st_etc_fallback(st, texImage)) {
273          /* ETC isn't supported by all gallium drivers, where it's represented
274           * by uncompressed formats. We store the compressed data (as it's
275           * needed for image copies in OES_copy_image), and decompress as
276           * necessary in Unmap.
277           *
278           * Note: all ETC1/ETC2 formats have 4x4 block sizes.
279           */
280          unsigned z = transfer->box.z;
281          struct st_texture_image_transfer *itransfer = &stImage->transfer[z];
282 
283          unsigned bytes = _mesa_get_format_bytes(texImage->TexFormat);
284          unsigned stride = *rowStrideOut = itransfer->temp_stride =
285             _mesa_format_row_stride(texImage->TexFormat, texImage->Width2);
286          *mapOut = itransfer->temp_data =
287             stImage->etc_data + ((x / 4) * bytes + (y / 4) * stride) +
288             z * stride * texImage->Height2 / 4;
289          itransfer->map = map;
290       }
291       else {
292          /* supported mapping */
293          *mapOut = map;
294          *rowStrideOut = transfer->stride;
295       }
296    }
297    else {
298       *mapOut = NULL;
299       *rowStrideOut = 0;
300    }
301 }
302 
303 
304 /** called via ctx->Driver.UnmapTextureImage() */
305 static void
st_UnmapTextureImage(struct gl_context * ctx,struct gl_texture_image * texImage,GLuint slice)306 st_UnmapTextureImage(struct gl_context *ctx,
307                      struct gl_texture_image *texImage,
308                      GLuint slice)
309 {
310    struct st_context *st = st_context(ctx);
311    struct st_texture_image *stImage  = st_texture_image(texImage);
312 
313    if (st_etc_fallback(st, texImage)) {
314       /* Decompress the ETC texture to the mapped one. */
315       unsigned z = slice + stImage->base.Face;
316       struct st_texture_image_transfer *itransfer = &stImage->transfer[z];
317       struct pipe_transfer *transfer = itransfer->transfer;
318 
319       assert(z == transfer->box.z);
320 
321       if (transfer->usage & PIPE_TRANSFER_WRITE) {
322          if (texImage->TexFormat == MESA_FORMAT_ETC1_RGB8) {
323             _mesa_etc1_unpack_rgba8888(itransfer->map, transfer->stride,
324                                        itransfer->temp_data,
325                                        itransfer->temp_stride,
326                                        transfer->box.width, transfer->box.height);
327          }
328          else {
329             _mesa_unpack_etc2_format(itransfer->map, transfer->stride,
330                                      itransfer->temp_data, itransfer->temp_stride,
331                                      transfer->box.width, transfer->box.height,
332                                      texImage->TexFormat);
333          }
334       }
335 
336       itransfer->temp_data = NULL;
337       itransfer->temp_stride = 0;
338       itransfer->map = 0;
339    }
340 
341    st_texture_image_unmap(st, stImage, slice);
342 }
343 
344 
345 /**
346  * Return default texture resource binding bitmask for the given format.
347  */
348 static GLuint
default_bindings(struct st_context * st,enum pipe_format format)349 default_bindings(struct st_context *st, enum pipe_format format)
350 {
351    struct pipe_screen *screen = st->pipe->screen;
352    const unsigned target = PIPE_TEXTURE_2D;
353    unsigned bindings;
354 
355    if (util_format_is_depth_or_stencil(format))
356       bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_DEPTH_STENCIL;
357    else
358       bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
359 
360    if (screen->is_format_supported(screen, format, target, 0, bindings))
361       return bindings;
362    else {
363       /* Try non-sRGB. */
364       format = util_format_linear(format);
365 
366       if (screen->is_format_supported(screen, format, target, 0, bindings))
367          return bindings;
368       else
369          return PIPE_BIND_SAMPLER_VIEW;
370    }
371 }
372 
373 
374 /**
375  * Given the size of a mipmap image, try to compute the size of the level=0
376  * mipmap image.
377  *
378  * Note that this isn't always accurate for odd-sized, non-POW textures.
379  * For example, if level=1 and width=40 then the level=0 width may be 80 or 81.
380  *
381  * \return GL_TRUE for success, GL_FALSE for failure
382  */
383 static GLboolean
guess_base_level_size(GLenum target,GLuint width,GLuint height,GLuint depth,GLuint level,GLuint * width0,GLuint * height0,GLuint * depth0)384 guess_base_level_size(GLenum target,
385                       GLuint width, GLuint height, GLuint depth, GLuint level,
386                       GLuint *width0, GLuint *height0, GLuint *depth0)
387 {
388    assert(width >= 1);
389    assert(height >= 1);
390    assert(depth >= 1);
391 
392    if (level > 0) {
393       /* Guess the size of the base level.
394        * Depending on the image's size, we can't always make a guess here.
395        */
396       switch (target) {
397       case GL_TEXTURE_1D:
398       case GL_TEXTURE_1D_ARRAY:
399          width <<= level;
400          break;
401 
402       case GL_TEXTURE_2D:
403       case GL_TEXTURE_2D_ARRAY:
404          /* We can't make a good guess here, because the base level dimensions
405           * can be non-square.
406           */
407          if (width == 1 || height == 1) {
408             return GL_FALSE;
409          }
410          width <<= level;
411          height <<= level;
412          break;
413 
414       case GL_TEXTURE_CUBE_MAP:
415       case GL_TEXTURE_CUBE_MAP_ARRAY:
416          width <<= level;
417          height <<= level;
418          break;
419 
420       case GL_TEXTURE_3D:
421          /* We can't make a good guess here, because the base level dimensions
422           * can be non-cube.
423           */
424          if (width == 1 || height == 1 || depth == 1) {
425             return GL_FALSE;
426          }
427          width <<= level;
428          height <<= level;
429          depth <<= level;
430          break;
431 
432       case GL_TEXTURE_RECTANGLE:
433          break;
434 
435       default:
436          assert(0);
437       }
438    }
439 
440    *width0 = width;
441    *height0 = height;
442    *depth0 = depth;
443 
444    return GL_TRUE;
445 }
446 
447 
448 /**
449  * Try to determine whether we should allocate memory for a full texture
450  * mipmap.  The problem is when we get a glTexImage(level=0) call, we
451  * can't immediately know if other mipmap levels are coming next.  Here
452  * we try to guess whether to allocate memory for a mipmap or just the
453  * 0th level.
454  *
455  * If we guess incorrectly here we'll later reallocate the right amount of
456  * memory either in st_AllocTextureImageBuffer() or st_finalize_texture().
457  *
458  * \param stObj  the texture object we're going to allocate memory for.
459  * \param stImage  describes the incoming image which we need to store.
460  */
461 static boolean
allocate_full_mipmap(const struct st_texture_object * stObj,const struct st_texture_image * stImage)462 allocate_full_mipmap(const struct st_texture_object *stObj,
463                      const struct st_texture_image *stImage)
464 {
465    switch (stObj->base.Target) {
466    case GL_TEXTURE_RECTANGLE_NV:
467    case GL_TEXTURE_BUFFER:
468    case GL_TEXTURE_EXTERNAL_OES:
469    case GL_TEXTURE_2D_MULTISAMPLE:
470    case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
471       /* these texture types cannot be mipmapped */
472       return FALSE;
473    }
474 
475    if (stImage->base.Level > 0 || stObj->base.GenerateMipmap)
476       return TRUE;
477 
478    if (stImage->base._BaseFormat == GL_DEPTH_COMPONENT ||
479        stImage->base._BaseFormat == GL_DEPTH_STENCIL_EXT)
480       /* depth/stencil textures are seldom mipmapped */
481       return FALSE;
482 
483    if (stObj->base.BaseLevel == 0 && stObj->base.MaxLevel == 0)
484       return FALSE;
485 
486    if (stObj->base.Sampler.MinFilter == GL_NEAREST ||
487        stObj->base.Sampler.MinFilter == GL_LINEAR)
488       /* not a mipmap minification filter */
489       return FALSE;
490 
491    if (stObj->base.Target == GL_TEXTURE_3D)
492       /* 3D textures are seldom mipmapped */
493       return FALSE;
494 
495    return TRUE;
496 }
497 
498 
499 /**
500  * Try to allocate a pipe_resource object for the given st_texture_object.
501  *
502  * We use the given st_texture_image as a clue to determine the size of the
503  * mipmap image at level=0.
504  *
505  * \return GL_TRUE for success, GL_FALSE if out of memory.
506  */
507 static GLboolean
guess_and_alloc_texture(struct st_context * st,struct st_texture_object * stObj,const struct st_texture_image * stImage)508 guess_and_alloc_texture(struct st_context *st,
509 			struct st_texture_object *stObj,
510 			const struct st_texture_image *stImage)
511 {
512    const struct gl_texture_image *firstImage;
513    GLuint lastLevel, width, height, depth;
514    GLuint bindings;
515    unsigned ptWidth;
516    uint16_t ptHeight, ptDepth, ptLayers;
517    enum pipe_format fmt;
518    bool guessed_box = false;
519 
520    DBG("%s\n", __func__);
521 
522    assert(!stObj->pt);
523 
524    /* If a base level image with compatible size exists, use that as our guess.
525     */
526    firstImage = _mesa_base_tex_image(&stObj->base);
527    if (firstImage &&
528        firstImage->Width2 > 0 &&
529        firstImage->Height2 > 0 &&
530        firstImage->Depth2 > 0 &&
531        guess_base_level_size(stObj->base.Target,
532                              firstImage->Width2,
533                              firstImage->Height2,
534                              firstImage->Depth2,
535                              firstImage->Level,
536                              &width, &height, &depth)) {
537       if (stImage->base.Width2 == u_minify(width, stImage->base.Level) &&
538           stImage->base.Height2 == u_minify(height, stImage->base.Level) &&
539           stImage->base.Depth2 == u_minify(depth, stImage->base.Level))
540          guessed_box = true;
541    }
542 
543    if (!guessed_box)
544       guessed_box = guess_base_level_size(stObj->base.Target,
545                                           stImage->base.Width2,
546                                           stImage->base.Height2,
547                                           stImage->base.Depth2,
548                                           stImage->base.Level,
549                                           &width, &height, &depth);
550 
551    if (!guessed_box) {
552       /* we can't determine the image size at level=0 */
553       /* this is not an out of memory error */
554       return GL_TRUE;
555    }
556 
557    /* At this point, (width x height x depth) is the expected size of
558     * the level=0 mipmap image.
559     */
560 
561    /* Guess a reasonable value for lastLevel.  With OpenGL we have no
562     * idea how many mipmap levels will be in a texture until we start
563     * to render with it.  Make an educated guess here but be prepared
564     * to re-allocating a texture buffer with space for more (or fewer)
565     * mipmap levels later.
566     */
567    if (allocate_full_mipmap(stObj, stImage)) {
568       /* alloc space for a full mipmap */
569       lastLevel = _mesa_get_tex_max_num_levels(stObj->base.Target,
570                                                width, height, depth) - 1;
571    }
572    else {
573       /* only alloc space for a single mipmap level */
574       lastLevel = 0;
575    }
576 
577    fmt = st_mesa_format_to_pipe_format(st, stImage->base.TexFormat);
578 
579    bindings = default_bindings(st, fmt);
580 
581    st_gl_texture_dims_to_pipe_dims(stObj->base.Target,
582                                    width, height, depth,
583                                    &ptWidth, &ptHeight, &ptDepth, &ptLayers);
584 
585    stObj->pt = st_texture_create(st,
586                                  gl_target_to_pipe(stObj->base.Target),
587                                  fmt,
588                                  lastLevel,
589                                  ptWidth,
590                                  ptHeight,
591                                  ptDepth,
592                                  ptLayers, 0,
593                                  bindings);
594 
595    stObj->lastLevel = lastLevel;
596 
597    DBG("%s returning %d\n", __func__, (stObj->pt != NULL));
598 
599    return stObj->pt != NULL;
600 }
601 
602 
603 /**
604  * Called via ctx->Driver.AllocTextureImageBuffer().
605  * If the texture object/buffer already has space for the indicated image,
606  * we're done.  Otherwise, allocate memory for the new texture image.
607  */
608 static GLboolean
st_AllocTextureImageBuffer(struct gl_context * ctx,struct gl_texture_image * texImage)609 st_AllocTextureImageBuffer(struct gl_context *ctx,
610                            struct gl_texture_image *texImage)
611 {
612    struct st_context *st = st_context(ctx);
613    struct st_texture_image *stImage = st_texture_image(texImage);
614    struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
615    const GLuint level = texImage->Level;
616    GLuint width = texImage->Width;
617    GLuint height = texImage->Height;
618    GLuint depth = texImage->Depth;
619 
620    DBG("%s\n", __func__);
621 
622    assert(!stImage->pt); /* xxx this might be wrong */
623 
624    stObj->needs_validation = true;
625 
626    etc_fallback_allocate(st, stImage);
627 
628    /* Look if the parent texture object has space for this image */
629    if (stObj->pt &&
630        level <= stObj->pt->last_level &&
631        st_texture_match_image(st, stObj->pt, texImage)) {
632       /* this image will fit in the existing texture object's memory */
633       pipe_resource_reference(&stImage->pt, stObj->pt);
634       return GL_TRUE;
635    }
636 
637    /* The parent texture object does not have space for this image */
638 
639    pipe_resource_reference(&stObj->pt, NULL);
640    st_texture_release_all_sampler_views(st, stObj);
641 
642    if (!guess_and_alloc_texture(st, stObj, stImage)) {
643       /* Probably out of memory.
644        * Try flushing any pending rendering, then retry.
645        */
646       st_finish(st);
647       if (!guess_and_alloc_texture(st, stObj, stImage)) {
648          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage");
649          return GL_FALSE;
650       }
651    }
652 
653    if (stObj->pt &&
654        st_texture_match_image(st, stObj->pt, texImage)) {
655       /* The image will live in the object's mipmap memory */
656       pipe_resource_reference(&stImage->pt, stObj->pt);
657       assert(stImage->pt);
658       return GL_TRUE;
659    }
660    else {
661       /* Create a new, temporary texture/resource/buffer to hold this
662        * one texture image.  Note that when we later access this image
663        * (either for mapping or copying) we'll want to always specify
664        * mipmap level=0, even if the image represents some other mipmap
665        * level.
666        */
667       enum pipe_format format =
668          st_mesa_format_to_pipe_format(st, texImage->TexFormat);
669       GLuint bindings = default_bindings(st, format);
670       unsigned ptWidth;
671       uint16_t ptHeight, ptDepth, ptLayers;
672 
673       st_gl_texture_dims_to_pipe_dims(stObj->base.Target,
674                                       width, height, depth,
675                                       &ptWidth, &ptHeight, &ptDepth, &ptLayers);
676 
677       stImage->pt = st_texture_create(st,
678                                       gl_target_to_pipe(stObj->base.Target),
679                                       format,
680                                       0, /* lastLevel */
681                                       ptWidth,
682                                       ptHeight,
683                                       ptDepth,
684                                       ptLayers, 0,
685                                       bindings);
686       return stImage->pt != NULL;
687    }
688 }
689 
690 
691 /**
692  * Preparation prior to glTexImage.  Basically check the 'surface_based'
693  * field and switch to a "normal" tex image if necessary.
694  */
695 static void
prep_teximage(struct gl_context * ctx,struct gl_texture_image * texImage,GLenum format,GLenum type)696 prep_teximage(struct gl_context *ctx, struct gl_texture_image *texImage,
697               GLenum format, GLenum type)
698 {
699    struct gl_texture_object *texObj = texImage->TexObject;
700    struct st_texture_object *stObj = st_texture_object(texObj);
701 
702    /* switch to "normal" */
703    if (stObj->surface_based) {
704       const GLenum target = texObj->Target;
705       const GLuint level = texImage->Level;
706       mesa_format texFormat;
707 
708       assert(!st_texture_image(texImage)->pt);
709       _mesa_clear_texture_object(ctx, texObj, texImage);
710       stObj->layer_override = 0;
711       stObj->level_override = 0;
712       pipe_resource_reference(&stObj->pt, NULL);
713 
714       /* oops, need to init this image again */
715       texFormat = _mesa_choose_texture_format(ctx, texObj, target, level,
716                                               texImage->InternalFormat, format,
717                                               type);
718 
719       _mesa_init_teximage_fields(ctx, texImage,
720                                  texImage->Width, texImage->Height,
721                                  texImage->Depth, texImage->Border,
722                                  texImage->InternalFormat, texFormat);
723 
724       stObj->surface_based = GL_FALSE;
725    }
726 }
727 
728 
729 /**
730  * Return a writemask for the gallium blit. The parameters can be base
731  * formats or "format" from glDrawPixels/glTexImage/glGetTexImage.
732  */
733 unsigned
st_get_blit_mask(GLenum srcFormat,GLenum dstFormat)734 st_get_blit_mask(GLenum srcFormat, GLenum dstFormat)
735 {
736    switch (dstFormat) {
737    case GL_DEPTH_STENCIL:
738       switch (srcFormat) {
739       case GL_DEPTH_STENCIL:
740          return PIPE_MASK_ZS;
741       case GL_DEPTH_COMPONENT:
742          return PIPE_MASK_Z;
743       case GL_STENCIL_INDEX:
744          return PIPE_MASK_S;
745       default:
746          assert(0);
747          return 0;
748       }
749 
750    case GL_DEPTH_COMPONENT:
751       switch (srcFormat) {
752       case GL_DEPTH_STENCIL:
753       case GL_DEPTH_COMPONENT:
754          return PIPE_MASK_Z;
755       default:
756          assert(0);
757          return 0;
758       }
759 
760    case GL_STENCIL_INDEX:
761       switch (srcFormat) {
762       case GL_STENCIL_INDEX:
763          return PIPE_MASK_S;
764       default:
765          assert(0);
766          return 0;
767       }
768 
769    default:
770       return PIPE_MASK_RGBA;
771    }
772 }
773 
774 /**
775  * Converts format to a format with the same components, types
776  * and sizes, but with the components in RGBA order.
777  */
778 static enum pipe_format
unswizzle_format(enum pipe_format format)779 unswizzle_format(enum pipe_format format)
780 {
781    switch (format)
782    {
783    case PIPE_FORMAT_B8G8R8A8_UNORM:
784    case PIPE_FORMAT_A8R8G8B8_UNORM:
785    case PIPE_FORMAT_A8B8G8R8_UNORM:
786       return PIPE_FORMAT_R8G8B8A8_UNORM;
787 
788    case PIPE_FORMAT_B10G10R10A2_UNORM:
789       return PIPE_FORMAT_R10G10B10A2_UNORM;
790 
791    case PIPE_FORMAT_B10G10R10A2_SNORM:
792       return PIPE_FORMAT_R10G10B10A2_SNORM;
793 
794    case PIPE_FORMAT_B10G10R10A2_UINT:
795       return PIPE_FORMAT_R10G10B10A2_UINT;
796 
797    default:
798       return format;
799    }
800 }
801 
802 /**
803  * Converts PIPE_FORMAT_A* to PIPE_FORMAT_R*.
804  */
805 static enum pipe_format
alpha_to_red(enum pipe_format format)806 alpha_to_red(enum pipe_format format)
807 {
808    switch (format)
809    {
810    case PIPE_FORMAT_A8_UNORM:
811       return PIPE_FORMAT_R8_UNORM;
812    case PIPE_FORMAT_A8_SNORM:
813       return PIPE_FORMAT_R8_SNORM;
814    case PIPE_FORMAT_A8_UINT:
815       return PIPE_FORMAT_R8_UINT;
816    case PIPE_FORMAT_A8_SINT:
817       return PIPE_FORMAT_R8_SINT;
818 
819    case PIPE_FORMAT_A16_UNORM:
820       return PIPE_FORMAT_R16_UNORM;
821    case PIPE_FORMAT_A16_SNORM:
822       return PIPE_FORMAT_R16_SNORM;
823    case PIPE_FORMAT_A16_UINT:
824       return PIPE_FORMAT_R16_UINT;
825    case PIPE_FORMAT_A16_SINT:
826       return PIPE_FORMAT_R16_SINT;
827    case PIPE_FORMAT_A16_FLOAT:
828       return PIPE_FORMAT_R16_FLOAT;
829 
830    case PIPE_FORMAT_A32_UINT:
831       return PIPE_FORMAT_R32_UINT;
832    case PIPE_FORMAT_A32_SINT:
833       return PIPE_FORMAT_R32_SINT;
834    case PIPE_FORMAT_A32_FLOAT:
835       return PIPE_FORMAT_R32_FLOAT;
836 
837    default:
838       return format;
839    }
840 }
841 
842 /**
843  * Converts PIPE_FORMAT_R*A* to PIPE_FORMAT_R*G*.
844  */
845 static enum pipe_format
red_alpha_to_red_green(enum pipe_format format)846 red_alpha_to_red_green(enum pipe_format format)
847 {
848    switch (format)
849    {
850    case PIPE_FORMAT_R8A8_UNORM:
851       return PIPE_FORMAT_R8G8_UNORM;
852    case PIPE_FORMAT_R8A8_SNORM:
853       return PIPE_FORMAT_R8G8_SNORM;
854    case PIPE_FORMAT_R8A8_UINT:
855       return PIPE_FORMAT_R8G8_UINT;
856    case PIPE_FORMAT_R8A8_SINT:
857       return PIPE_FORMAT_R8G8_SINT;
858 
859    case PIPE_FORMAT_R16A16_UNORM:
860       return PIPE_FORMAT_R16G16_UNORM;
861    case PIPE_FORMAT_R16A16_SNORM:
862       return PIPE_FORMAT_R16G16_SNORM;
863    case PIPE_FORMAT_R16A16_UINT:
864       return PIPE_FORMAT_R16G16_UINT;
865    case PIPE_FORMAT_R16A16_SINT:
866       return PIPE_FORMAT_R16G16_SINT;
867    case PIPE_FORMAT_R16A16_FLOAT:
868       return PIPE_FORMAT_R16G16_FLOAT;
869 
870    case PIPE_FORMAT_R32A32_UINT:
871       return PIPE_FORMAT_R32G32_UINT;
872    case PIPE_FORMAT_R32A32_SINT:
873       return PIPE_FORMAT_R32G32_SINT;
874    case PIPE_FORMAT_R32A32_FLOAT:
875       return PIPE_FORMAT_R32G32_FLOAT;
876 
877    default:
878        return format;
879    }
880 }
881 
882 /**
883  * Converts PIPE_FORMAT_L*A* to PIPE_FORMAT_R*G*.
884  */
885 static enum pipe_format
luminance_alpha_to_red_green(enum pipe_format format)886 luminance_alpha_to_red_green(enum pipe_format format)
887 {
888    switch (format)
889    {
890    case PIPE_FORMAT_L8A8_UNORM:
891       return PIPE_FORMAT_R8G8_UNORM;
892    case PIPE_FORMAT_L8A8_SNORM:
893       return PIPE_FORMAT_R8G8_SNORM;
894    case PIPE_FORMAT_L8A8_UINT:
895       return PIPE_FORMAT_R8G8_UINT;
896    case PIPE_FORMAT_L8A8_SINT:
897       return PIPE_FORMAT_R8G8_SINT;
898 
899    case PIPE_FORMAT_L16A16_UNORM:
900       return PIPE_FORMAT_R16G16_UNORM;
901    case PIPE_FORMAT_L16A16_SNORM:
902       return PIPE_FORMAT_R16G16_SNORM;
903    case PIPE_FORMAT_L16A16_UINT:
904       return PIPE_FORMAT_R16G16_UINT;
905    case PIPE_FORMAT_L16A16_SINT:
906       return PIPE_FORMAT_R16G16_SINT;
907    case PIPE_FORMAT_L16A16_FLOAT:
908       return PIPE_FORMAT_R16G16_FLOAT;
909 
910    case PIPE_FORMAT_L32A32_UINT:
911       return PIPE_FORMAT_R32G32_UINT;
912    case PIPE_FORMAT_L32A32_SINT:
913       return PIPE_FORMAT_R32G32_SINT;
914    case PIPE_FORMAT_L32A32_FLOAT:
915       return PIPE_FORMAT_R32G32_FLOAT;
916 
917    default:
918        return format;
919    }
920 }
921 
922 /**
923  * Returns true if format is a PIPE_FORMAT_A* format, and false otherwise.
924  */
925 static bool
format_is_alpha(enum pipe_format format)926 format_is_alpha(enum pipe_format format)
927 {
928    const struct util_format_description *desc = util_format_description(format);
929 
930    if (desc->nr_channels == 1 &&
931        desc->swizzle[0] == PIPE_SWIZZLE_0 &&
932        desc->swizzle[1] == PIPE_SWIZZLE_0 &&
933        desc->swizzle[2] == PIPE_SWIZZLE_0 &&
934        desc->swizzle[3] == PIPE_SWIZZLE_X)
935       return true;
936 
937    return false;
938 }
939 
940 /**
941  * Returns true if format is a PIPE_FORMAT_R* format, and false otherwise.
942  */
943 static bool
format_is_red(enum pipe_format format)944 format_is_red(enum pipe_format format)
945 {
946    const struct util_format_description *desc = util_format_description(format);
947 
948    if (desc->nr_channels == 1 &&
949        desc->swizzle[0] == PIPE_SWIZZLE_X &&
950        desc->swizzle[1] == PIPE_SWIZZLE_0 &&
951        desc->swizzle[2] == PIPE_SWIZZLE_0 &&
952        desc->swizzle[3] == PIPE_SWIZZLE_1)
953       return true;
954 
955    return false;
956 }
957 
958 
959 /**
960  * Returns true if format is a PIPE_FORMAT_L* format, and false otherwise.
961  */
962 static bool
format_is_luminance(enum pipe_format format)963 format_is_luminance(enum pipe_format format)
964 {
965    const struct util_format_description *desc = util_format_description(format);
966 
967    if (desc->nr_channels == 1 &&
968        desc->swizzle[0] == PIPE_SWIZZLE_X &&
969        desc->swizzle[1] == PIPE_SWIZZLE_X &&
970        desc->swizzle[2] == PIPE_SWIZZLE_X &&
971        desc->swizzle[3] == PIPE_SWIZZLE_1)
972       return true;
973 
974    return false;
975 }
976 
977 /**
978  * Returns true if format is a PIPE_FORMAT_R*A* format, and false otherwise.
979  */
980 static bool
format_is_red_alpha(enum pipe_format format)981 format_is_red_alpha(enum pipe_format format)
982 {
983    const struct util_format_description *desc = util_format_description(format);
984 
985    if (desc->nr_channels == 2 &&
986        desc->swizzle[0] == PIPE_SWIZZLE_X &&
987        desc->swizzle[1] == PIPE_SWIZZLE_0 &&
988        desc->swizzle[2] == PIPE_SWIZZLE_0 &&
989        desc->swizzle[3] == PIPE_SWIZZLE_Y)
990       return true;
991 
992    return false;
993 }
994 
995 static bool
format_is_swizzled_rgba(enum pipe_format format)996 format_is_swizzled_rgba(enum pipe_format format)
997 {
998     const struct util_format_description *desc = util_format_description(format);
999 
1000     if ((desc->swizzle[0] == TGSI_SWIZZLE_X || desc->swizzle[0] == PIPE_SWIZZLE_0) &&
1001         (desc->swizzle[1] == TGSI_SWIZZLE_Y || desc->swizzle[1] == PIPE_SWIZZLE_0) &&
1002         (desc->swizzle[2] == TGSI_SWIZZLE_Z || desc->swizzle[2] == PIPE_SWIZZLE_0) &&
1003         (desc->swizzle[3] == TGSI_SWIZZLE_W || desc->swizzle[3] == PIPE_SWIZZLE_1))
1004        return false;
1005 
1006     return true;
1007 }
1008 
1009 struct format_table
1010 {
1011    unsigned char swizzle[4];
1012    enum pipe_format format;
1013 };
1014 
1015 static const struct format_table table_8888_unorm[] = {
1016    { { 0, 1, 2, 3 }, PIPE_FORMAT_R8G8B8A8_UNORM },
1017    { { 2, 1, 0, 3 }, PIPE_FORMAT_B8G8R8A8_UNORM },
1018    { { 3, 0, 1, 2 }, PIPE_FORMAT_A8R8G8B8_UNORM },
1019    { { 3, 2, 1, 0 }, PIPE_FORMAT_A8B8G8R8_UNORM }
1020 };
1021 
1022 static const struct format_table table_1010102_unorm[] = {
1023    { { 0, 1, 2, 3 }, PIPE_FORMAT_R10G10B10A2_UNORM },
1024    { { 2, 1, 0, 3 }, PIPE_FORMAT_B10G10R10A2_UNORM }
1025 };
1026 
1027 static const struct format_table table_1010102_snorm[] = {
1028    { { 0, 1, 2, 3 }, PIPE_FORMAT_R10G10B10A2_SNORM },
1029    { { 2, 1, 0, 3 }, PIPE_FORMAT_B10G10R10A2_SNORM }
1030 };
1031 
1032 static const struct format_table table_1010102_uint[] = {
1033    { { 0, 1, 2, 3 }, PIPE_FORMAT_R10G10B10A2_UINT },
1034    { { 2, 1, 0, 3 }, PIPE_FORMAT_B10G10R10A2_UINT }
1035 };
1036 
1037 static enum pipe_format
swizzle_format(enum pipe_format format,const int * const swizzle)1038 swizzle_format(enum pipe_format format, const int * const swizzle)
1039 {
1040    unsigned i;
1041 
1042    switch (format) {
1043    case PIPE_FORMAT_R8G8B8A8_UNORM:
1044    case PIPE_FORMAT_B8G8R8A8_UNORM:
1045    case PIPE_FORMAT_A8R8G8B8_UNORM:
1046    case PIPE_FORMAT_A8B8G8R8_UNORM:
1047       for (i = 0; i < ARRAY_SIZE(table_8888_unorm); i++) {
1048          if (swizzle[0] == table_8888_unorm[i].swizzle[0] &&
1049              swizzle[1] == table_8888_unorm[i].swizzle[1] &&
1050              swizzle[2] == table_8888_unorm[i].swizzle[2] &&
1051              swizzle[3] == table_8888_unorm[i].swizzle[3])
1052             return table_8888_unorm[i].format;
1053       }
1054       break;
1055 
1056    case PIPE_FORMAT_R10G10B10A2_UNORM:
1057    case PIPE_FORMAT_B10G10R10A2_UNORM:
1058       for (i = 0; i < ARRAY_SIZE(table_1010102_unorm); i++) {
1059          if (swizzle[0] == table_1010102_unorm[i].swizzle[0] &&
1060              swizzle[1] == table_1010102_unorm[i].swizzle[1] &&
1061              swizzle[2] == table_1010102_unorm[i].swizzle[2] &&
1062              swizzle[3] == table_1010102_unorm[i].swizzle[3])
1063             return table_1010102_unorm[i].format;
1064       }
1065       break;
1066 
1067    case PIPE_FORMAT_R10G10B10A2_SNORM:
1068    case PIPE_FORMAT_B10G10R10A2_SNORM:
1069       for (i = 0; i < ARRAY_SIZE(table_1010102_snorm); i++) {
1070          if (swizzle[0] == table_1010102_snorm[i].swizzle[0] &&
1071              swizzle[1] == table_1010102_snorm[i].swizzle[1] &&
1072              swizzle[2] == table_1010102_snorm[i].swizzle[2] &&
1073              swizzle[3] == table_1010102_snorm[i].swizzle[3])
1074             return table_1010102_snorm[i].format;
1075       }
1076       break;
1077 
1078    case PIPE_FORMAT_R10G10B10A2_UINT:
1079    case PIPE_FORMAT_B10G10R10A2_UINT:
1080       for (i = 0; i < ARRAY_SIZE(table_1010102_uint); i++) {
1081          if (swizzle[0] == table_1010102_uint[i].swizzle[0] &&
1082              swizzle[1] == table_1010102_uint[i].swizzle[1] &&
1083              swizzle[2] == table_1010102_uint[i].swizzle[2] &&
1084              swizzle[3] == table_1010102_uint[i].swizzle[3])
1085             return table_1010102_uint[i].format;
1086       }
1087       break;
1088 
1089    default:
1090       break;
1091    }
1092 
1093    return PIPE_FORMAT_NONE;
1094 }
1095 
1096 static bool
reinterpret_formats(enum pipe_format * src_format,enum pipe_format * dst_format)1097 reinterpret_formats(enum pipe_format *src_format, enum pipe_format *dst_format)
1098 {
1099    enum pipe_format src = *src_format;
1100    enum pipe_format dst = *dst_format;
1101 
1102    /* Note: dst_format has already been transformed from luminance/intensity
1103     *       to red when this function is called.  The source format will never
1104     *       be an intensity format, because GL_INTENSITY is not a legal value
1105     *       for the format parameter in glTex(Sub)Image(). */
1106 
1107    if (format_is_alpha(src)) {
1108       if (!format_is_alpha(dst))
1109          return false;
1110 
1111       src = alpha_to_red(src);
1112       dst = alpha_to_red(dst);
1113    } else if (format_is_luminance(src)) {
1114       if (!format_is_red(dst) && !format_is_red_alpha(dst))
1115          return false;
1116 
1117       src = util_format_luminance_to_red(src);
1118    } else if (util_format_is_luminance_alpha(src)) {
1119       src = luminance_alpha_to_red_green(src);
1120 
1121       if (format_is_red_alpha(dst)) {
1122          dst = red_alpha_to_red_green(dst);
1123       } else if (!format_is_red(dst))
1124          return false;
1125    } else if (format_is_swizzled_rgba(src)) {
1126       const struct util_format_description *src_desc = util_format_description(src);
1127       const struct util_format_description *dst_desc = util_format_description(dst);
1128       int swizzle[4];
1129       unsigned i;
1130 
1131       /* Make sure the format is an RGBA and not an RGBX format */
1132       if (src_desc->nr_channels != 4 || src_desc->swizzle[3] == PIPE_SWIZZLE_1)
1133          return false;
1134 
1135       if (dst_desc->nr_channels != 4 || dst_desc->swizzle[3] == PIPE_SWIZZLE_1)
1136          return false;
1137 
1138       for (i = 0; i < 4; i++)
1139          swizzle[i] = dst_desc->swizzle[src_desc->swizzle[i]];
1140 
1141       dst = swizzle_format(dst, swizzle);
1142       if (dst == PIPE_FORMAT_NONE)
1143          return false;
1144 
1145       src = unswizzle_format(src);
1146    }
1147 
1148    *src_format = src;
1149    *dst_format = dst;
1150    return true;
1151 }
1152 
1153 static bool
try_pbo_upload_common(struct gl_context * ctx,struct pipe_surface * surface,const struct st_pbo_addresses * addr,enum pipe_format src_format)1154 try_pbo_upload_common(struct gl_context *ctx,
1155                       struct pipe_surface *surface,
1156                       const struct st_pbo_addresses *addr,
1157                       enum pipe_format src_format)
1158 {
1159    struct st_context *st = st_context(ctx);
1160    struct cso_context *cso = st->cso_context;
1161    struct pipe_context *pipe = st->pipe;
1162    bool success = false;
1163    void *fs;
1164 
1165    fs = st_pbo_get_upload_fs(st, src_format, surface->format);
1166    if (!fs)
1167       return false;
1168 
1169    cso_save_state(cso, (CSO_BIT_FRAGMENT_SAMPLER_VIEWS |
1170                         CSO_BIT_FRAGMENT_SAMPLERS |
1171                         CSO_BIT_VERTEX_ELEMENTS |
1172                         CSO_BIT_AUX_VERTEX_BUFFER_SLOT |
1173                         CSO_BIT_FRAMEBUFFER |
1174                         CSO_BIT_VIEWPORT |
1175                         CSO_BIT_BLEND |
1176                         CSO_BIT_DEPTH_STENCIL_ALPHA |
1177                         CSO_BIT_RASTERIZER |
1178                         CSO_BIT_STREAM_OUTPUTS |
1179                         CSO_BIT_PAUSE_QUERIES |
1180                         CSO_BIT_SAMPLE_MASK |
1181                         CSO_BIT_MIN_SAMPLES |
1182                         CSO_BIT_RENDER_CONDITION |
1183                         CSO_BITS_ALL_SHADERS));
1184    cso_save_constant_buffer_slot0(cso, PIPE_SHADER_FRAGMENT);
1185 
1186    cso_set_sample_mask(cso, ~0);
1187    cso_set_min_samples(cso, 1);
1188    cso_set_render_condition(cso, NULL, FALSE, 0);
1189 
1190    /* Set up the sampler_view */
1191    {
1192       struct pipe_sampler_view templ;
1193       struct pipe_sampler_view *sampler_view;
1194       struct pipe_sampler_state sampler = {0};
1195       const struct pipe_sampler_state *samplers[1] = {&sampler};
1196 
1197       memset(&templ, 0, sizeof(templ));
1198       templ.target = PIPE_BUFFER;
1199       templ.format = src_format;
1200       templ.u.buf.offset = addr->first_element * addr->bytes_per_pixel;
1201       templ.u.buf.size = (addr->last_element - addr->first_element + 1) *
1202                          addr->bytes_per_pixel;
1203       templ.swizzle_r = PIPE_SWIZZLE_X;
1204       templ.swizzle_g = PIPE_SWIZZLE_Y;
1205       templ.swizzle_b = PIPE_SWIZZLE_Z;
1206       templ.swizzle_a = PIPE_SWIZZLE_W;
1207 
1208       sampler_view = pipe->create_sampler_view(pipe, addr->buffer, &templ);
1209       if (sampler_view == NULL)
1210          goto fail;
1211 
1212       cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, 1, &sampler_view);
1213 
1214       pipe_sampler_view_reference(&sampler_view, NULL);
1215 
1216       cso_set_samplers(cso, PIPE_SHADER_FRAGMENT, 1, samplers);
1217    }
1218 
1219    /* Framebuffer_state */
1220    {
1221       struct pipe_framebuffer_state fb;
1222       memset(&fb, 0, sizeof(fb));
1223       fb.width = surface->width;
1224       fb.height = surface->height;
1225       fb.nr_cbufs = 1;
1226       pipe_surface_reference(&fb.cbufs[0], surface);
1227 
1228       cso_set_framebuffer(cso, &fb);
1229 
1230       pipe_surface_reference(&fb.cbufs[0], NULL);
1231    }
1232 
1233    cso_set_viewport_dims(cso, surface->width, surface->height, FALSE);
1234 
1235    /* Blend state */
1236    cso_set_blend(cso, &st->pbo.upload_blend);
1237 
1238    /* Depth/stencil/alpha state */
1239    {
1240       struct pipe_depth_stencil_alpha_state dsa;
1241       memset(&dsa, 0, sizeof(dsa));
1242       cso_set_depth_stencil_alpha(cso, &dsa);
1243    }
1244 
1245    /* Set up the fragment shader */
1246    cso_set_fragment_shader_handle(cso, fs);
1247 
1248    success = st_pbo_draw(st, addr, surface->width, surface->height);
1249 
1250 fail:
1251    cso_restore_state(cso);
1252    cso_restore_constant_buffer_slot0(cso, PIPE_SHADER_FRAGMENT);
1253 
1254    return success;
1255 }
1256 
1257 static bool
try_pbo_upload(struct gl_context * ctx,GLuint dims,struct gl_texture_image * texImage,GLenum format,GLenum type,enum pipe_format dst_format,GLint xoffset,GLint yoffset,GLint zoffset,GLint width,GLint height,GLint depth,const void * pixels,const struct gl_pixelstore_attrib * unpack)1258 try_pbo_upload(struct gl_context *ctx, GLuint dims,
1259                struct gl_texture_image *texImage,
1260                GLenum format, GLenum type,
1261                enum pipe_format dst_format,
1262                GLint xoffset, GLint yoffset, GLint zoffset,
1263                GLint width, GLint height, GLint depth,
1264                const void *pixels,
1265                const struct gl_pixelstore_attrib *unpack)
1266 {
1267    struct st_context *st = st_context(ctx);
1268    struct st_texture_image *stImage = st_texture_image(texImage);
1269    struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
1270    struct pipe_resource *texture = stImage->pt;
1271    struct pipe_context *pipe = st->pipe;
1272    struct pipe_screen *screen = pipe->screen;
1273    struct pipe_surface *surface = NULL;
1274    struct st_pbo_addresses addr;
1275    enum pipe_format src_format;
1276    const struct util_format_description *desc;
1277    GLenum gl_target = texImage->TexObject->Target;
1278    bool success;
1279 
1280    if (!st->pbo.upload_enabled)
1281       return false;
1282 
1283    /* From now on, we need the gallium representation of dimensions. */
1284    if (gl_target == GL_TEXTURE_1D_ARRAY) {
1285       depth = height;
1286       height = 1;
1287       zoffset = yoffset;
1288       yoffset = 0;
1289    }
1290 
1291    if (depth != 1 && !st->pbo.layers)
1292       return false;
1293 
1294    /* Choose the source format. Initially, we do so without checking driver
1295     * support at all because of the remapping we later perform and because
1296     * at least the Radeon driver actually supports some formats for texture
1297     * buffers which it doesn't support for regular textures. */
1298    src_format = st_choose_matching_format(st, 0, format, type, unpack->SwapBytes);
1299    if (!src_format) {
1300       return false;
1301    }
1302 
1303    src_format = util_format_linear(src_format);
1304    desc = util_format_description(src_format);
1305 
1306    if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN)
1307       return false;
1308 
1309    if (desc->colorspace != UTIL_FORMAT_COLORSPACE_RGB)
1310       return false;
1311 
1312    if (st->pbo.rgba_only) {
1313       enum pipe_format orig_dst_format = dst_format;
1314 
1315       if (!reinterpret_formats(&src_format, &dst_format)) {
1316          return false;
1317       }
1318 
1319       if (dst_format != orig_dst_format &&
1320           !screen->is_format_supported(screen, dst_format, PIPE_TEXTURE_2D, 0,
1321                                        PIPE_BIND_RENDER_TARGET)) {
1322          return false;
1323       }
1324    }
1325 
1326    if (!src_format ||
1327        !screen->is_format_supported(screen, src_format, PIPE_BUFFER, 0,
1328                                     PIPE_BIND_SAMPLER_VIEW)) {
1329       return false;
1330    }
1331 
1332    /* Compute buffer addresses */
1333    addr.xoffset = xoffset;
1334    addr.yoffset = yoffset;
1335    addr.width = width;
1336    addr.height = height;
1337    addr.depth = depth;
1338    addr.bytes_per_pixel = desc->block.bits / 8;
1339 
1340    if (!st_pbo_addresses_pixelstore(st, gl_target, dims == 3, unpack, pixels,
1341                                     &addr))
1342       return false;
1343 
1344    /* Set up the surface */
1345    {
1346       unsigned level = stObj->pt != stImage->pt ? 0 : texImage->TexObject->MinLevel + texImage->Level;
1347       unsigned max_layer = util_max_layer(texture, level);
1348 
1349       zoffset += texImage->Face + texImage->TexObject->MinLayer;
1350 
1351       struct pipe_surface templ;
1352       memset(&templ, 0, sizeof(templ));
1353       templ.format = dst_format;
1354       templ.u.tex.level = level;
1355       templ.u.tex.first_layer = MIN2(zoffset, max_layer);
1356       templ.u.tex.last_layer = MIN2(zoffset + depth - 1, max_layer);
1357 
1358       surface = pipe->create_surface(pipe, texture, &templ);
1359       if (!surface)
1360          return false;
1361    }
1362 
1363    success = try_pbo_upload_common(ctx, surface, &addr, src_format);
1364 
1365    pipe_surface_reference(&surface, NULL);
1366 
1367    return success;
1368 }
1369 
1370 static void
st_TexSubImage(struct gl_context * ctx,GLuint dims,struct gl_texture_image * texImage,GLint xoffset,GLint yoffset,GLint zoffset,GLint width,GLint height,GLint depth,GLenum format,GLenum type,const void * pixels,const struct gl_pixelstore_attrib * unpack)1371 st_TexSubImage(struct gl_context *ctx, GLuint dims,
1372                struct gl_texture_image *texImage,
1373                GLint xoffset, GLint yoffset, GLint zoffset,
1374                GLint width, GLint height, GLint depth,
1375                GLenum format, GLenum type, const void *pixels,
1376                const struct gl_pixelstore_attrib *unpack)
1377 {
1378    struct st_context *st = st_context(ctx);
1379    struct st_texture_image *stImage = st_texture_image(texImage);
1380    struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
1381    struct pipe_context *pipe = st->pipe;
1382    struct pipe_screen *screen = pipe->screen;
1383    struct pipe_resource *dst = stImage->pt;
1384    struct pipe_resource *src = NULL;
1385    struct pipe_resource src_templ;
1386    struct pipe_transfer *transfer;
1387    struct pipe_blit_info blit;
1388    enum pipe_format src_format, dst_format;
1389    mesa_format mesa_src_format;
1390    GLenum gl_target = texImage->TexObject->Target;
1391    unsigned bind;
1392    GLubyte *map;
1393    unsigned dstz = texImage->Face + texImage->TexObject->MinLayer;
1394    unsigned dst_level = 0;
1395 
1396    st_flush_bitmap_cache(st);
1397    st_invalidate_readpix_cache(st);
1398 
1399    if (stObj->pt == stImage->pt)
1400       dst_level = texImage->TexObject->MinLevel + texImage->Level;
1401 
1402    assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
1403           texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
1404 
1405    if (!dst)
1406       goto fallback;
1407 
1408    /* Try texture_subdata, which should be the fastest memcpy path. */
1409    if (pixels &&
1410        !_mesa_is_bufferobj(unpack->BufferObj) &&
1411        _mesa_texstore_can_use_memcpy(ctx, texImage->_BaseFormat,
1412                                      texImage->TexFormat, format, type,
1413                                      unpack)) {
1414       struct pipe_box box;
1415       unsigned stride, layer_stride;
1416       void *data;
1417 
1418       stride = _mesa_image_row_stride(unpack, width, format, type);
1419       layer_stride = _mesa_image_image_stride(unpack, width, height, format,
1420                                               type);
1421       data = _mesa_image_address(dims, unpack, pixels, width, height, format,
1422                                  type, 0, 0, 0);
1423 
1424       /* Convert to Gallium coordinates. */
1425       if (gl_target == GL_TEXTURE_1D_ARRAY) {
1426          zoffset = yoffset;
1427          yoffset = 0;
1428          depth = height;
1429          height = 1;
1430          layer_stride = stride;
1431       }
1432 
1433       u_box_3d(xoffset, yoffset, zoffset + dstz, width, height, depth, &box);
1434       pipe->texture_subdata(pipe, dst, dst_level, 0,
1435                             &box, data, stride, layer_stride);
1436       return;
1437    }
1438 
1439    if (!st->prefer_blit_based_texture_transfer) {
1440       goto fallback;
1441    }
1442 
1443    /* XXX Fallback for depth-stencil formats due to an incomplete stencil
1444     * blit implementation in some drivers. */
1445    if (format == GL_DEPTH_STENCIL) {
1446       goto fallback;
1447    }
1448 
1449    /* If the base internal format and the texture format don't match,
1450     * we can't use blit-based TexSubImage. */
1451    if (texImage->_BaseFormat !=
1452        _mesa_get_format_base_format(texImage->TexFormat)) {
1453       goto fallback;
1454    }
1455 
1456 
1457    /* See if the destination format is supported. */
1458    if (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL)
1459       bind = PIPE_BIND_DEPTH_STENCIL;
1460    else
1461       bind = PIPE_BIND_RENDER_TARGET;
1462 
1463    /* For luminance and intensity, only the red channel is stored
1464     * in the destination. */
1465    dst_format = util_format_linear(dst->format);
1466    dst_format = util_format_luminance_to_red(dst_format);
1467    dst_format = util_format_intensity_to_red(dst_format);
1468 
1469    if (!dst_format ||
1470        !screen->is_format_supported(screen, dst_format, dst->target,
1471                                     dst->nr_samples, bind)) {
1472       goto fallback;
1473    }
1474 
1475    if (_mesa_is_bufferobj(unpack->BufferObj)) {
1476       if (try_pbo_upload(ctx, dims, texImage, format, type, dst_format,
1477                          xoffset, yoffset, zoffset,
1478                          width, height, depth, pixels, unpack))
1479          return;
1480    }
1481 
1482    /* See if the texture format already matches the format and type,
1483     * in which case the memcpy-based fast path will likely be used and
1484     * we don't have to blit. */
1485    if (_mesa_format_matches_format_and_type(texImage->TexFormat, format,
1486                                             type, unpack->SwapBytes, NULL)) {
1487       goto fallback;
1488    }
1489 
1490    /* Choose the source format. */
1491    src_format = st_choose_matching_format(st, PIPE_BIND_SAMPLER_VIEW,
1492                                           format, type, unpack->SwapBytes);
1493    if (!src_format) {
1494       goto fallback;
1495    }
1496 
1497    mesa_src_format = st_pipe_format_to_mesa_format(src_format);
1498 
1499    /* There is no reason to do this if we cannot use memcpy for the temporary
1500     * source texture at least. This also takes transfer ops into account,
1501     * etc. */
1502    if (!_mesa_texstore_can_use_memcpy(ctx,
1503                              _mesa_get_format_base_format(mesa_src_format),
1504                              mesa_src_format, format, type, unpack)) {
1505       goto fallback;
1506    }
1507 
1508    /* TexSubImage only sets a single cubemap face. */
1509    if (gl_target == GL_TEXTURE_CUBE_MAP) {
1510       gl_target = GL_TEXTURE_2D;
1511    }
1512    /* TexSubImage can specify subsets of cube map array faces
1513     * so we need to upload via 2D array instead */
1514    if (gl_target == GL_TEXTURE_CUBE_MAP_ARRAY) {
1515       gl_target = GL_TEXTURE_2D_ARRAY;
1516    }
1517 
1518    /* Initialize the source texture description. */
1519    memset(&src_templ, 0, sizeof(src_templ));
1520    src_templ.target = gl_target_to_pipe(gl_target);
1521    src_templ.format = src_format;
1522    src_templ.bind = PIPE_BIND_SAMPLER_VIEW;
1523    src_templ.usage = PIPE_USAGE_STAGING;
1524 
1525    st_gl_texture_dims_to_pipe_dims(gl_target, width, height, depth,
1526                                    &src_templ.width0, &src_templ.height0,
1527                                    &src_templ.depth0, &src_templ.array_size);
1528 
1529    /* Check for NPOT texture support. */
1530    if (!screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES) &&
1531        (!util_is_power_of_two(src_templ.width0) ||
1532         !util_is_power_of_two(src_templ.height0) ||
1533         !util_is_power_of_two(src_templ.depth0))) {
1534       goto fallback;
1535    }
1536 
1537    /* Create the source texture. */
1538    src = screen->resource_create(screen, &src_templ);
1539    if (!src) {
1540       goto fallback;
1541    }
1542 
1543    /* Map source pixels. */
1544    pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, depth,
1545                                         format, type, pixels, unpack,
1546                                         "glTexSubImage");
1547    if (!pixels) {
1548       /* This is a GL error. */
1549       pipe_resource_reference(&src, NULL);
1550       return;
1551    }
1552 
1553    /* From now on, we need the gallium representation of dimensions. */
1554    if (gl_target == GL_TEXTURE_1D_ARRAY) {
1555       zoffset = yoffset;
1556       yoffset = 0;
1557       depth = height;
1558       height = 1;
1559    }
1560 
1561    map = pipe_transfer_map_3d(pipe, src, 0, PIPE_TRANSFER_WRITE, 0, 0, 0,
1562                               width, height, depth, &transfer);
1563    if (!map) {
1564       _mesa_unmap_teximage_pbo(ctx, unpack);
1565       pipe_resource_reference(&src, NULL);
1566       goto fallback;
1567    }
1568 
1569    /* Upload pixels (just memcpy). */
1570    {
1571       const uint bytesPerRow = width * util_format_get_blocksize(src_format);
1572       GLuint row, slice;
1573 
1574       for (slice = 0; slice < (unsigned) depth; slice++) {
1575          if (gl_target == GL_TEXTURE_1D_ARRAY) {
1576             /* 1D array textures.
1577              * We need to convert gallium coords to GL coords.
1578              */
1579             void *src = _mesa_image_address2d(unpack, pixels,
1580                                                 width, depth, format,
1581                                                 type, slice, 0);
1582             memcpy(map, src, bytesPerRow);
1583          }
1584          else {
1585             ubyte *slice_map = map;
1586 
1587             for (row = 0; row < (unsigned) height; row++) {
1588                void *src = _mesa_image_address(dims, unpack, pixels,
1589                                                  width, height, format,
1590                                                  type, slice, row, 0);
1591                memcpy(slice_map, src, bytesPerRow);
1592                slice_map += transfer->stride;
1593             }
1594          }
1595          map += transfer->layer_stride;
1596       }
1597    }
1598 
1599    pipe_transfer_unmap(pipe, transfer);
1600    _mesa_unmap_teximage_pbo(ctx, unpack);
1601 
1602    /* Blit. */
1603    memset(&blit, 0, sizeof(blit));
1604    blit.src.resource = src;
1605    blit.src.level = 0;
1606    blit.src.format = src_format;
1607    blit.dst.resource = dst;
1608    blit.dst.level = dst_level;
1609    blit.dst.format = dst_format;
1610    blit.src.box.x = blit.src.box.y = blit.src.box.z = 0;
1611    blit.dst.box.x = xoffset;
1612    blit.dst.box.y = yoffset;
1613    blit.dst.box.z = zoffset + dstz;
1614    blit.src.box.width = blit.dst.box.width = width;
1615    blit.src.box.height = blit.dst.box.height = height;
1616    blit.src.box.depth = blit.dst.box.depth = depth;
1617    blit.mask = st_get_blit_mask(format, texImage->_BaseFormat);
1618    blit.filter = PIPE_TEX_FILTER_NEAREST;
1619    blit.scissor_enable = FALSE;
1620 
1621    st->pipe->blit(st->pipe, &blit);
1622 
1623    pipe_resource_reference(&src, NULL);
1624    return;
1625 
1626 fallback:
1627    _mesa_store_texsubimage(ctx, dims, texImage, xoffset, yoffset, zoffset,
1628                            width, height, depth, format, type, pixels,
1629                            unpack);
1630 }
1631 
1632 static void
st_TexImage(struct gl_context * ctx,GLuint dims,struct gl_texture_image * texImage,GLenum format,GLenum type,const void * pixels,const struct gl_pixelstore_attrib * unpack)1633 st_TexImage(struct gl_context * ctx, GLuint dims,
1634             struct gl_texture_image *texImage,
1635             GLenum format, GLenum type, const void *pixels,
1636             const struct gl_pixelstore_attrib *unpack)
1637 {
1638    assert(dims == 1 || dims == 2 || dims == 3);
1639 
1640    prep_teximage(ctx, texImage, format, type);
1641 
1642    if (texImage->Width == 0 || texImage->Height == 0 || texImage->Depth == 0)
1643       return;
1644 
1645    /* allocate storage for texture data */
1646    if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage)) {
1647       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage%uD", dims);
1648       return;
1649    }
1650 
1651    st_TexSubImage(ctx, dims, texImage, 0, 0, 0,
1652                   texImage->Width, texImage->Height, texImage->Depth,
1653                   format, type, pixels, unpack);
1654 }
1655 
1656 
1657 static void
st_CompressedTexSubImage(struct gl_context * ctx,GLuint dims,struct gl_texture_image * texImage,GLint x,GLint y,GLint z,GLsizei w,GLsizei h,GLsizei d,GLenum format,GLsizei imageSize,const void * data)1658 st_CompressedTexSubImage(struct gl_context *ctx, GLuint dims,
1659                          struct gl_texture_image *texImage,
1660                          GLint x, GLint y, GLint z,
1661                          GLsizei w, GLsizei h, GLsizei d,
1662                          GLenum format, GLsizei imageSize, const void *data)
1663 {
1664    struct st_context *st = st_context(ctx);
1665    struct st_texture_image *stImage = st_texture_image(texImage);
1666    struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
1667    struct pipe_resource *texture = stImage->pt;
1668    struct pipe_context *pipe = st->pipe;
1669    struct pipe_screen *screen = pipe->screen;
1670    struct pipe_resource *dst = stImage->pt;
1671    struct pipe_surface *surface = NULL;
1672    struct compressed_pixelstore store;
1673    struct st_pbo_addresses addr;
1674    enum pipe_format copy_format;
1675    unsigned bw, bh;
1676    intptr_t buf_offset;
1677    bool success = false;
1678 
1679    /* Check basic pre-conditions for PBO upload */
1680    if (!st->prefer_blit_based_texture_transfer) {
1681       goto fallback;
1682    }
1683 
1684    if (!_mesa_is_bufferobj(ctx->Unpack.BufferObj))
1685       goto fallback;
1686 
1687    if (st_etc_fallback(st, texImage)) {
1688       /* ETC isn't supported and is represented by uncompressed formats. */
1689       goto fallback;
1690    }
1691 
1692    if (!dst) {
1693       goto fallback;
1694    }
1695 
1696    if (!st->pbo.upload_enabled ||
1697        !screen->get_param(screen, PIPE_CAP_SURFACE_REINTERPRET_BLOCKS)) {
1698       goto fallback;
1699    }
1700 
1701    /* Choose the pipe format for the upload. */
1702    addr.bytes_per_pixel = util_format_get_blocksize(dst->format);
1703    bw = util_format_get_blockwidth(dst->format);
1704    bh = util_format_get_blockheight(dst->format);
1705 
1706    switch (addr.bytes_per_pixel) {
1707    case 8:
1708       copy_format = PIPE_FORMAT_R16G16B16A16_UINT;
1709       break;
1710    case 16:
1711       copy_format = PIPE_FORMAT_R32G32B32A32_UINT;
1712       break;
1713    default:
1714       goto fallback;
1715    }
1716 
1717    if (!screen->is_format_supported(screen, copy_format, PIPE_BUFFER, 0,
1718                                     PIPE_BIND_SAMPLER_VIEW)) {
1719       goto fallback;
1720    }
1721 
1722    if (!screen->is_format_supported(screen, copy_format, dst->target,
1723                                     dst->nr_samples, PIPE_BIND_RENDER_TARGET)) {
1724       goto fallback;
1725    }
1726 
1727    /* Interpret the pixelstore settings. */
1728    _mesa_compute_compressed_pixelstore(dims, texImage->TexFormat, w, h, d,
1729                                        &ctx->Unpack, &store);
1730    assert(store.CopyBytesPerRow % addr.bytes_per_pixel == 0);
1731    assert(store.SkipBytes % addr.bytes_per_pixel == 0);
1732 
1733    /* Compute the offset into the buffer */
1734    buf_offset = (intptr_t)data + store.SkipBytes;
1735 
1736    if (buf_offset % addr.bytes_per_pixel) {
1737       goto fallback;
1738    }
1739 
1740    buf_offset = buf_offset / addr.bytes_per_pixel;
1741 
1742    addr.xoffset = x / bw;
1743    addr.yoffset = y / bh;
1744    addr.width = store.CopyBytesPerRow / addr.bytes_per_pixel;
1745    addr.height = store.CopyRowsPerSlice;
1746    addr.depth = d;
1747    addr.pixels_per_row = store.TotalBytesPerRow / addr.bytes_per_pixel;
1748    addr.image_height = store.TotalRowsPerSlice;
1749 
1750    if (!st_pbo_addresses_setup(st, st_buffer_object(ctx->Unpack.BufferObj)->buffer,
1751                                buf_offset, &addr))
1752       goto fallback;
1753 
1754    /* Set up the surface. */
1755    {
1756       unsigned level = stObj->pt != stImage->pt ? 0 : texImage->TexObject->MinLevel + texImage->Level;
1757       unsigned max_layer = util_max_layer(texture, level);
1758 
1759       z += texImage->Face + texImage->TexObject->MinLayer;
1760 
1761       struct pipe_surface templ;
1762       memset(&templ, 0, sizeof(templ));
1763       templ.format = copy_format;
1764       templ.u.tex.level = level;
1765       templ.u.tex.first_layer = MIN2(z, max_layer);
1766       templ.u.tex.last_layer = MIN2(z + d - 1, max_layer);
1767 
1768       surface = pipe->create_surface(pipe, texture, &templ);
1769       if (!surface)
1770          goto fallback;
1771    }
1772 
1773    success = try_pbo_upload_common(ctx, surface, &addr, copy_format);
1774 
1775    pipe_surface_reference(&surface, NULL);
1776 
1777    if (success)
1778       return;
1779 
1780 fallback:
1781    _mesa_store_compressed_texsubimage(ctx, dims, texImage,
1782                                       x, y, z, w, h, d,
1783                                       format, imageSize, data);
1784 }
1785 
1786 static void
st_CompressedTexImage(struct gl_context * ctx,GLuint dims,struct gl_texture_image * texImage,GLsizei imageSize,const void * data)1787 st_CompressedTexImage(struct gl_context *ctx, GLuint dims,
1788                       struct gl_texture_image *texImage,
1789                       GLsizei imageSize, const void *data)
1790 {
1791    prep_teximage(ctx, texImage, GL_NONE, GL_NONE);
1792 
1793    /* only 2D and 3D compressed images are supported at this time */
1794    if (dims == 1) {
1795       _mesa_problem(ctx, "Unexpected glCompressedTexImage1D call");
1796       return;
1797    }
1798 
1799    /* This is pretty simple, because unlike the general texstore path we don't
1800     * have to worry about the usual image unpacking or image transfer
1801     * operations.
1802     */
1803    assert(texImage);
1804    assert(texImage->Width > 0);
1805    assert(texImage->Height > 0);
1806    assert(texImage->Depth > 0);
1807 
1808    /* allocate storage for texture data */
1809    if (!st_AllocTextureImageBuffer(ctx, texImage)) {
1810       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage%uD", dims);
1811       return;
1812    }
1813 
1814    st_CompressedTexSubImage(ctx, dims, texImage,
1815                             0, 0, 0,
1816                             texImage->Width, texImage->Height, texImage->Depth,
1817                             texImage->TexFormat,
1818                             imageSize, data);
1819 }
1820 
1821 
1822 
1823 
1824 /**
1825  * Called via ctx->Driver.GetTexSubImage()
1826  *
1827  * This uses a blit to copy the texture to a texture format which matches
1828  * the format and type combo and then a fast read-back is done using memcpy.
1829  * We can do arbitrary X/Y/Z/W/0/1 swizzling here as long as there is
1830  * a format which matches the swizzling.
1831  *
1832  * If such a format isn't available, it falls back to _mesa_GetTexImage_sw.
1833  *
1834  * NOTE: Drivers usually do a blit to convert between tiled and linear
1835  *       texture layouts during texture uploads/downloads, so the blit
1836  *       we do here should be free in such cases.
1837  */
1838 static void
st_GetTexSubImage(struct gl_context * ctx,GLint xoffset,GLint yoffset,GLint zoffset,GLsizei width,GLsizei height,GLint depth,GLenum format,GLenum type,void * pixels,struct gl_texture_image * texImage)1839 st_GetTexSubImage(struct gl_context * ctx,
1840                   GLint xoffset, GLint yoffset, GLint zoffset,
1841                   GLsizei width, GLsizei height, GLint depth,
1842                   GLenum format, GLenum type, void * pixels,
1843                   struct gl_texture_image *texImage)
1844 {
1845    struct st_context *st = st_context(ctx);
1846    struct pipe_context *pipe = st->pipe;
1847    struct pipe_screen *screen = pipe->screen;
1848    struct st_texture_image *stImage = st_texture_image(texImage);
1849    struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
1850    struct pipe_resource *src = stObj->pt;
1851    struct pipe_resource *dst = NULL;
1852    struct pipe_resource dst_templ;
1853    enum pipe_format dst_format, src_format;
1854    mesa_format mesa_format;
1855    GLenum gl_target = texImage->TexObject->Target;
1856    enum pipe_texture_target pipe_target;
1857    unsigned dims;
1858    struct pipe_blit_info blit;
1859    unsigned bind;
1860    struct pipe_transfer *tex_xfer;
1861    ubyte *map = NULL;
1862    boolean done = FALSE;
1863 
1864    assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
1865           texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
1866 
1867    st_flush_bitmap_cache(st);
1868 
1869    if (!st->prefer_blit_based_texture_transfer &&
1870        !_mesa_is_format_compressed(texImage->TexFormat)) {
1871       /* Try to avoid the fallback if we're doing texture decompression here */
1872       goto fallback;
1873    }
1874 
1875    /* Handle non-finalized textures. */
1876    if (!stImage->pt || stImage->pt != stObj->pt || !src) {
1877       goto fallback;
1878    }
1879 
1880    /* XXX Fallback to _mesa_GetTexImage_sw for depth-stencil formats
1881     * due to an incomplete stencil blit implementation in some drivers. */
1882    if (format == GL_DEPTH_STENCIL || format == GL_STENCIL_INDEX) {
1883       goto fallback;
1884    }
1885 
1886    /* If the base internal format and the texture format don't match, we have
1887     * to fall back to _mesa_GetTexImage_sw. */
1888    if (texImage->_BaseFormat !=
1889        _mesa_get_format_base_format(texImage->TexFormat)) {
1890       goto fallback;
1891    }
1892 
1893    /* See if the texture format already matches the format and type,
1894     * in which case the memcpy-based fast path will be used. */
1895    if (_mesa_format_matches_format_and_type(texImage->TexFormat, format,
1896                                             type, ctx->Pack.SwapBytes, NULL)) {
1897       goto fallback;
1898    }
1899 
1900    /* Convert the source format to what is expected by GetTexImage
1901     * and see if it's supported.
1902     *
1903     * This only applies to glGetTexImage:
1904     * - Luminance must be returned as (L,0,0,1).
1905     * - Luminance alpha must be returned as (L,0,0,A).
1906     * - Intensity must be returned as (I,0,0,1)
1907     */
1908    if (stObj->surface_based)
1909       src_format = util_format_linear(stObj->surface_format);
1910    else
1911       src_format = util_format_linear(src->format);
1912    src_format = util_format_luminance_to_red(src_format);
1913    src_format = util_format_intensity_to_red(src_format);
1914 
1915    if (!src_format ||
1916        !screen->is_format_supported(screen, src_format, src->target,
1917                                     src->nr_samples,
1918                                     PIPE_BIND_SAMPLER_VIEW)) {
1919       goto fallback;
1920    }
1921 
1922    if (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL)
1923       bind = PIPE_BIND_DEPTH_STENCIL;
1924    else
1925       bind = PIPE_BIND_RENDER_TARGET;
1926 
1927    /* GetTexImage only returns a single face for cubemaps. */
1928    if (gl_target == GL_TEXTURE_CUBE_MAP) {
1929       gl_target = GL_TEXTURE_2D;
1930    }
1931    pipe_target = gl_target_to_pipe(gl_target);
1932 
1933    /* Choose the destination format by finding the best match
1934     * for the format+type combo. */
1935    dst_format = st_choose_matching_format(st, bind, format, type,
1936 					  ctx->Pack.SwapBytes);
1937 
1938    if (dst_format == PIPE_FORMAT_NONE) {
1939       GLenum dst_glformat;
1940 
1941       /* Fall back to _mesa_GetTexImage_sw except for compressed formats,
1942        * where decompression with a blit is always preferred. */
1943       if (!util_format_is_compressed(src->format)) {
1944          goto fallback;
1945       }
1946 
1947       /* Set the appropriate format for the decompressed texture.
1948        * Luminance and sRGB formats shouldn't appear here.*/
1949       switch (src_format) {
1950       case PIPE_FORMAT_DXT1_RGB:
1951       case PIPE_FORMAT_DXT1_RGBA:
1952       case PIPE_FORMAT_DXT3_RGBA:
1953       case PIPE_FORMAT_DXT5_RGBA:
1954       case PIPE_FORMAT_RGTC1_UNORM:
1955       case PIPE_FORMAT_RGTC2_UNORM:
1956       case PIPE_FORMAT_ETC1_RGB8:
1957       case PIPE_FORMAT_BPTC_RGBA_UNORM:
1958          dst_glformat = GL_RGBA8;
1959          break;
1960       case PIPE_FORMAT_RGTC1_SNORM:
1961       case PIPE_FORMAT_RGTC2_SNORM:
1962          if (!ctx->Extensions.EXT_texture_snorm)
1963             goto fallback;
1964          dst_glformat = GL_RGBA8_SNORM;
1965          break;
1966       case PIPE_FORMAT_BPTC_RGB_FLOAT:
1967       case PIPE_FORMAT_BPTC_RGB_UFLOAT:
1968          if (!ctx->Extensions.ARB_texture_float)
1969             goto fallback;
1970          dst_glformat = GL_RGBA32F;
1971          break;
1972       default:
1973          assert(0);
1974          goto fallback;
1975       }
1976 
1977       dst_format = st_choose_format(st, dst_glformat, format, type,
1978                                     pipe_target, 0, bind, FALSE);
1979 
1980       if (dst_format == PIPE_FORMAT_NONE) {
1981          /* unable to get an rgba format!?! */
1982          goto fallback;
1983       }
1984    }
1985 
1986    /* create the destination texture of size (width X height X depth) */
1987    memset(&dst_templ, 0, sizeof(dst_templ));
1988    dst_templ.target = pipe_target;
1989    dst_templ.format = dst_format;
1990    dst_templ.bind = bind;
1991    dst_templ.usage = PIPE_USAGE_STAGING;
1992 
1993    st_gl_texture_dims_to_pipe_dims(gl_target, width, height, depth,
1994                                    &dst_templ.width0, &dst_templ.height0,
1995                                    &dst_templ.depth0, &dst_templ.array_size);
1996 
1997    dst = screen->resource_create(screen, &dst_templ);
1998    if (!dst) {
1999       goto fallback;
2000    }
2001 
2002    /* From now on, we need the gallium representation of dimensions. */
2003    if (gl_target == GL_TEXTURE_1D_ARRAY) {
2004       zoffset = yoffset;
2005       yoffset = 0;
2006       depth = height;
2007       height = 1;
2008    }
2009 
2010    assert(texImage->Face == 0 ||
2011           texImage->TexObject->MinLayer == 0 ||
2012           zoffset == 0);
2013 
2014    memset(&blit, 0, sizeof(blit));
2015    blit.src.resource = src;
2016    blit.src.level = texImage->Level + texImage->TexObject->MinLevel;
2017    blit.src.format = src_format;
2018    blit.dst.resource = dst;
2019    blit.dst.level = 0;
2020    blit.dst.format = dst->format;
2021    blit.src.box.x = xoffset;
2022    blit.dst.box.x = 0;
2023    blit.src.box.y = yoffset;
2024    blit.dst.box.y = 0;
2025    blit.src.box.z = texImage->Face + texImage->TexObject->MinLayer + zoffset;
2026    blit.dst.box.z = 0;
2027    blit.src.box.width = blit.dst.box.width = width;
2028    blit.src.box.height = blit.dst.box.height = height;
2029    blit.src.box.depth = blit.dst.box.depth = depth;
2030    blit.mask = st_get_blit_mask(texImage->_BaseFormat, format);
2031    blit.filter = PIPE_TEX_FILTER_NEAREST;
2032    blit.scissor_enable = FALSE;
2033 
2034    /* blit/render/decompress */
2035    st->pipe->blit(st->pipe, &blit);
2036 
2037    pixels = _mesa_map_pbo_dest(ctx, &ctx->Pack, pixels);
2038 
2039    map = pipe_transfer_map_3d(pipe, dst, 0, PIPE_TRANSFER_READ,
2040                               0, 0, 0, width, height, depth, &tex_xfer);
2041    if (!map) {
2042       goto end;
2043    }
2044 
2045    mesa_format = st_pipe_format_to_mesa_format(dst_format);
2046    dims = _mesa_get_texture_dimensions(gl_target);
2047 
2048    /* copy/pack data into user buffer */
2049    if (_mesa_format_matches_format_and_type(mesa_format, format, type,
2050                                             ctx->Pack.SwapBytes, NULL)) {
2051       /* memcpy */
2052       const uint bytesPerRow = width * util_format_get_blocksize(dst_format);
2053       GLuint row, slice;
2054 
2055       for (slice = 0; slice < depth; slice++) {
2056          ubyte *slice_map = map;
2057 
2058          for (row = 0; row < height; row++) {
2059             void *dest = _mesa_image_address(dims, &ctx->Pack, pixels,
2060                                              width, height, format, type,
2061                                              slice, row, 0);
2062 
2063             memcpy(dest, slice_map, bytesPerRow);
2064 
2065             slice_map += tex_xfer->stride;
2066          }
2067 
2068          map += tex_xfer->layer_stride;
2069       }
2070    }
2071    else {
2072       /* format translation via floats */
2073       GLuint slice;
2074       GLfloat *rgba;
2075       uint32_t dstMesaFormat;
2076       int dstStride, srcStride;
2077 
2078       assert(util_format_is_compressed(src->format));
2079 
2080       rgba = malloc(width * height * 4 * sizeof(GLfloat));
2081       if (!rgba) {
2082          goto end;
2083       }
2084 
2085       if (ST_DEBUG & DEBUG_FALLBACK)
2086          debug_printf("%s: fallback format translation\n", __func__);
2087 
2088       dstMesaFormat = _mesa_format_from_format_and_type(format, type);
2089       dstStride = _mesa_image_row_stride(&ctx->Pack, width, format, type);
2090       srcStride = 4 * width * sizeof(GLfloat);
2091       for (slice = 0; slice < depth; slice++) {
2092          void *dest = _mesa_image_address(dims, &ctx->Pack, pixels,
2093                                           width, height, format, type,
2094                                           slice, 0, 0);
2095 
2096          /* get float[4] rgba row from surface */
2097          pipe_get_tile_rgba_format(tex_xfer, map, 0, 0, width, height,
2098                                    dst_format, rgba);
2099 
2100          _mesa_format_convert(dest, dstMesaFormat, dstStride,
2101                               rgba, RGBA32_FLOAT, srcStride,
2102                               width, height, NULL);
2103 
2104          /* Handle byte swapping if required */
2105          if (ctx->Pack.SwapBytes) {
2106             _mesa_swap_bytes_2d_image(format, type, &ctx->Pack,
2107                                       width, height, dest, dest);
2108          }
2109 
2110          map += tex_xfer->layer_stride;
2111       }
2112 
2113       free(rgba);
2114    }
2115    done = TRUE;
2116 
2117 end:
2118    if (map)
2119       pipe_transfer_unmap(pipe, tex_xfer);
2120 
2121    _mesa_unmap_pbo_dest(ctx, &ctx->Pack);
2122    pipe_resource_reference(&dst, NULL);
2123 
2124 fallback:
2125    if (!done) {
2126       _mesa_GetTexSubImage_sw(ctx, xoffset, yoffset, zoffset,
2127                               width, height, depth,
2128                               format, type, pixels, texImage);
2129    }
2130 }
2131 
2132 
2133 /**
2134  * Do a CopyTexSubImage operation using a read transfer from the source,
2135  * a write transfer to the destination and get_tile()/put_tile() to access
2136  * the pixels/texels.
2137  *
2138  * Note: srcY=0=TOP of renderbuffer
2139  */
2140 static void
fallback_copy_texsubimage(struct gl_context * ctx,struct st_renderbuffer * strb,struct st_texture_image * stImage,GLenum baseFormat,GLint destX,GLint destY,GLint slice,GLint srcX,GLint srcY,GLsizei width,GLsizei height)2141 fallback_copy_texsubimage(struct gl_context *ctx,
2142                           struct st_renderbuffer *strb,
2143                           struct st_texture_image *stImage,
2144                           GLenum baseFormat,
2145                           GLint destX, GLint destY, GLint slice,
2146                           GLint srcX, GLint srcY,
2147                           GLsizei width, GLsizei height)
2148 {
2149    struct st_context *st = st_context(ctx);
2150    struct pipe_context *pipe = st->pipe;
2151    struct pipe_transfer *src_trans;
2152    GLubyte *texDest;
2153    enum pipe_transfer_usage transfer_usage;
2154    void *map;
2155    unsigned dst_width = width;
2156    unsigned dst_height = height;
2157    unsigned dst_depth = 1;
2158    struct pipe_transfer *transfer;
2159 
2160    if (ST_DEBUG & DEBUG_FALLBACK)
2161       debug_printf("%s: fallback processing\n", __func__);
2162 
2163    if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) {
2164       srcY = strb->Base.Height - srcY - height;
2165    }
2166 
2167    map = pipe_transfer_map(pipe,
2168                            strb->texture,
2169                            strb->surface->u.tex.level,
2170                            strb->surface->u.tex.first_layer,
2171                            PIPE_TRANSFER_READ,
2172                            srcX, srcY,
2173                            width, height, &src_trans);
2174 
2175    if ((baseFormat == GL_DEPTH_COMPONENT ||
2176         baseFormat == GL_DEPTH_STENCIL) &&
2177        util_format_is_depth_and_stencil(stImage->pt->format))
2178       transfer_usage = PIPE_TRANSFER_READ_WRITE;
2179    else
2180       transfer_usage = PIPE_TRANSFER_WRITE;
2181 
2182    texDest = st_texture_image_map(st, stImage, transfer_usage,
2183                                   destX, destY, slice,
2184                                   dst_width, dst_height, dst_depth,
2185                                   &transfer);
2186 
2187    if (baseFormat == GL_DEPTH_COMPONENT ||
2188        baseFormat == GL_DEPTH_STENCIL) {
2189       const GLboolean scaleOrBias = (ctx->Pixel.DepthScale != 1.0F ||
2190                                      ctx->Pixel.DepthBias != 0.0F);
2191       GLint row, yStep;
2192       uint *data;
2193 
2194       /* determine bottom-to-top vs. top-to-bottom order for src buffer */
2195       if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) {
2196          srcY = height - 1;
2197          yStep = -1;
2198       }
2199       else {
2200          srcY = 0;
2201          yStep = 1;
2202       }
2203 
2204       data = malloc(width * sizeof(uint));
2205 
2206       if (data) {
2207          /* To avoid a large temp memory allocation, do copy row by row */
2208          for (row = 0; row < height; row++, srcY += yStep) {
2209             pipe_get_tile_z(src_trans, map, 0, srcY, width, 1, data);
2210             if (scaleOrBias) {
2211                _mesa_scale_and_bias_depth_uint(ctx, width, data);
2212             }
2213 
2214             if (stImage->pt->target == PIPE_TEXTURE_1D_ARRAY) {
2215                pipe_put_tile_z(transfer, texDest + row*transfer->layer_stride,
2216                                0, 0, width, 1, data);
2217             }
2218             else {
2219                pipe_put_tile_z(transfer, texDest, 0, row, width, 1, data);
2220             }
2221          }
2222       }
2223       else {
2224          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexSubImage()");
2225       }
2226 
2227       free(data);
2228    }
2229    else {
2230       /* RGBA format */
2231       GLfloat *tempSrc =
2232          malloc(width * height * 4 * sizeof(GLfloat));
2233 
2234       if (tempSrc && texDest) {
2235          const GLint dims = 2;
2236          GLint dstRowStride;
2237          struct gl_texture_image *texImage = &stImage->base;
2238          struct gl_pixelstore_attrib unpack = ctx->DefaultPacking;
2239 
2240          if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) {
2241             unpack.Invert = GL_TRUE;
2242          }
2243 
2244          if (stImage->pt->target == PIPE_TEXTURE_1D_ARRAY) {
2245             dstRowStride = transfer->layer_stride;
2246          }
2247          else {
2248             dstRowStride = transfer->stride;
2249          }
2250 
2251          /* get float/RGBA image from framebuffer */
2252          /* XXX this usually involves a lot of int/float conversion.
2253           * try to avoid that someday.
2254           */
2255          pipe_get_tile_rgba_format(src_trans, map, 0, 0, width, height,
2256                                    util_format_linear(strb->texture->format),
2257                                    tempSrc);
2258 
2259          /* Store into texture memory.
2260           * Note that this does some special things such as pixel transfer
2261           * ops and format conversion.  In particular, if the dest tex format
2262           * is actually RGBA but the user created the texture as GL_RGB we
2263           * need to fill-in/override the alpha channel with 1.0.
2264           */
2265          _mesa_texstore(ctx, dims,
2266                         texImage->_BaseFormat,
2267                         texImage->TexFormat,
2268                         dstRowStride,
2269                         &texDest,
2270                         width, height, 1,
2271                         GL_RGBA, GL_FLOAT, tempSrc, /* src */
2272                         &unpack);
2273       }
2274       else {
2275          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage");
2276       }
2277 
2278       free(tempSrc);
2279    }
2280 
2281    st_texture_image_unmap(st, stImage, slice);
2282    pipe->transfer_unmap(pipe, src_trans);
2283 }
2284 
2285 
2286 /**
2287  * Do a CopyTex[Sub]Image1/2/3D() using a hardware (blit) path if possible.
2288  * Note that the region to copy has already been clipped so we know we
2289  * won't read from outside the source renderbuffer's bounds.
2290  *
2291  * Note: srcY=0=Bottom of renderbuffer (GL convention)
2292  */
2293 static void
st_CopyTexSubImage(struct gl_context * ctx,GLuint dims,struct gl_texture_image * texImage,GLint destX,GLint destY,GLint slice,struct gl_renderbuffer * rb,GLint srcX,GLint srcY,GLsizei width,GLsizei height)2294 st_CopyTexSubImage(struct gl_context *ctx, GLuint dims,
2295                    struct gl_texture_image *texImage,
2296                    GLint destX, GLint destY, GLint slice,
2297                    struct gl_renderbuffer *rb,
2298                    GLint srcX, GLint srcY, GLsizei width, GLsizei height)
2299 {
2300    struct st_texture_image *stImage = st_texture_image(texImage);
2301    struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
2302    struct st_renderbuffer *strb = st_renderbuffer(rb);
2303    struct st_context *st = st_context(ctx);
2304    struct pipe_context *pipe = st->pipe;
2305    struct pipe_screen *screen = pipe->screen;
2306    struct pipe_blit_info blit;
2307    enum pipe_format dst_format;
2308    GLboolean do_flip = (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP);
2309    unsigned bind;
2310    GLint srcY0, srcY1;
2311 
2312    st_flush_bitmap_cache(st);
2313    st_invalidate_readpix_cache(st);
2314 
2315    assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
2316           texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
2317 
2318    if (!strb || !strb->surface || !stImage->pt) {
2319       debug_printf("%s: null strb or stImage\n", __func__);
2320       return;
2321    }
2322 
2323    if (_mesa_texstore_needs_transfer_ops(ctx, texImage->_BaseFormat,
2324                                          texImage->TexFormat)) {
2325       goto fallback;
2326    }
2327 
2328    /* The base internal format must match the mesa format, so make sure
2329     * e.g. an RGB internal format is really allocated as RGB and not as RGBA.
2330     */
2331    if (texImage->_BaseFormat !=
2332        _mesa_get_format_base_format(texImage->TexFormat) ||
2333        rb->_BaseFormat != _mesa_get_format_base_format(rb->Format)) {
2334       goto fallback;
2335    }
2336 
2337    /* Choose the destination format to match the TexImage behavior. */
2338    dst_format = util_format_linear(stImage->pt->format);
2339    dst_format = util_format_luminance_to_red(dst_format);
2340    dst_format = util_format_intensity_to_red(dst_format);
2341 
2342    /* See if the destination format is supported. */
2343    if (texImage->_BaseFormat == GL_DEPTH_STENCIL ||
2344        texImage->_BaseFormat == GL_DEPTH_COMPONENT) {
2345       bind = PIPE_BIND_DEPTH_STENCIL;
2346    }
2347    else {
2348       bind = PIPE_BIND_RENDER_TARGET;
2349    }
2350 
2351    if (!dst_format ||
2352        !screen->is_format_supported(screen, dst_format, stImage->pt->target,
2353                                     stImage->pt->nr_samples, bind)) {
2354       goto fallback;
2355    }
2356 
2357    /* Y flipping for the main framebuffer. */
2358    if (do_flip) {
2359       srcY1 = strb->Base.Height - srcY - height;
2360       srcY0 = srcY1 + height;
2361    }
2362    else {
2363       srcY0 = srcY;
2364       srcY1 = srcY0 + height;
2365    }
2366 
2367    /* Blit the texture.
2368     * This supports flipping, format conversions, and downsampling.
2369     */
2370    memset(&blit, 0, sizeof(blit));
2371    blit.src.resource = strb->texture;
2372    blit.src.format = util_format_linear(strb->surface->format);
2373    blit.src.level = strb->surface->u.tex.level;
2374    blit.src.box.x = srcX;
2375    blit.src.box.y = srcY0;
2376    blit.src.box.z = strb->surface->u.tex.first_layer;
2377    blit.src.box.width = width;
2378    blit.src.box.height = srcY1 - srcY0;
2379    blit.src.box.depth = 1;
2380    blit.dst.resource = stImage->pt;
2381    blit.dst.format = dst_format;
2382    blit.dst.level = stObj->pt != stImage->pt ? 0 : texImage->Level + texImage->TexObject->MinLevel;
2383    blit.dst.box.x = destX;
2384    blit.dst.box.y = destY;
2385    blit.dst.box.z = stImage->base.Face + slice + texImage->TexObject->MinLayer;
2386    blit.dst.box.width = width;
2387    blit.dst.box.height = height;
2388    blit.dst.box.depth = 1;
2389    blit.mask = st_get_blit_mask(rb->_BaseFormat, texImage->_BaseFormat);
2390    blit.filter = PIPE_TEX_FILTER_NEAREST;
2391    pipe->blit(pipe, &blit);
2392    return;
2393 
2394 fallback:
2395    /* software fallback */
2396    fallback_copy_texsubimage(ctx,
2397                              strb, stImage, texImage->_BaseFormat,
2398                              destX, destY, slice,
2399                              srcX, srcY, width, height);
2400 }
2401 
2402 
2403 /**
2404  * Copy image data from stImage into the texture object 'stObj' at level
2405  * 'dstLevel'.
2406  */
2407 static void
copy_image_data_to_texture(struct st_context * st,struct st_texture_object * stObj,GLuint dstLevel,struct st_texture_image * stImage)2408 copy_image_data_to_texture(struct st_context *st,
2409 			   struct st_texture_object *stObj,
2410                            GLuint dstLevel,
2411 			   struct st_texture_image *stImage)
2412 {
2413    /* debug checks */
2414    {
2415       const struct gl_texture_image MAYBE_UNUSED *dstImage =
2416          stObj->base.Image[stImage->base.Face][dstLevel];
2417       assert(dstImage);
2418       assert(dstImage->Width == stImage->base.Width);
2419       assert(dstImage->Height == stImage->base.Height);
2420       assert(dstImage->Depth == stImage->base.Depth);
2421    }
2422 
2423    if (stImage->pt) {
2424       /* Copy potentially with the blitter:
2425        */
2426       GLuint src_level;
2427       if (stImage->pt->last_level == 0)
2428          src_level = 0;
2429       else
2430          src_level = stImage->base.Level;
2431 
2432       assert(src_level <= stImage->pt->last_level);
2433       assert(u_minify(stImage->pt->width0, src_level) == stImage->base.Width);
2434       assert(stImage->pt->target == PIPE_TEXTURE_1D_ARRAY ||
2435              u_minify(stImage->pt->height0, src_level) == stImage->base.Height);
2436       assert(stImage->pt->target == PIPE_TEXTURE_2D_ARRAY ||
2437              stImage->pt->target == PIPE_TEXTURE_CUBE_ARRAY ||
2438              u_minify(stImage->pt->depth0, src_level) == stImage->base.Depth);
2439 
2440       st_texture_image_copy(st->pipe,
2441                             stObj->pt, dstLevel,  /* dest texture, level */
2442                             stImage->pt, src_level, /* src texture, level */
2443                             stImage->base.Face);
2444 
2445       pipe_resource_reference(&stImage->pt, NULL);
2446    }
2447    pipe_resource_reference(&stImage->pt, stObj->pt);
2448 }
2449 
2450 
2451 /**
2452  * Called during state validation.  When this function is finished,
2453  * the texture object should be ready for rendering.
2454  * \return GL_TRUE for success, GL_FALSE for failure (out of mem)
2455  */
2456 GLboolean
st_finalize_texture(struct gl_context * ctx,struct pipe_context * pipe,struct gl_texture_object * tObj,GLuint cubeMapFace)2457 st_finalize_texture(struct gl_context *ctx,
2458 		    struct pipe_context *pipe,
2459 		    struct gl_texture_object *tObj,
2460 		    GLuint cubeMapFace)
2461 {
2462    struct st_context *st = st_context(ctx);
2463    struct st_texture_object *stObj = st_texture_object(tObj);
2464    const GLuint nr_faces = _mesa_num_tex_faces(stObj->base.Target);
2465    GLuint face;
2466    const struct st_texture_image *firstImage;
2467    enum pipe_format firstImageFormat;
2468    unsigned ptWidth;
2469    uint16_t ptHeight, ptDepth, ptLayers, ptNumSamples;
2470 
2471    if (tObj->Immutable)
2472       return GL_TRUE;
2473 
2474    if (_mesa_is_texture_complete(tObj, &tObj->Sampler)) {
2475       /* The texture is complete and we know exactly how many mipmap levels
2476        * are present/needed.  This is conditional because we may be called
2477        * from the st_generate_mipmap() function when the texture object is
2478        * incomplete.  In that case, we'll have set stObj->lastLevel before
2479        * we get here.
2480        */
2481       if (stObj->base.Sampler.MinFilter == GL_LINEAR ||
2482           stObj->base.Sampler.MinFilter == GL_NEAREST)
2483          stObj->lastLevel = stObj->base.BaseLevel;
2484       else
2485          stObj->lastLevel = stObj->base._MaxLevel;
2486    }
2487 
2488    /* Skip the loop over images in the common case of no images having
2489     * changed.  But if the GL_BASE_LEVEL or GL_MAX_LEVEL change to something we
2490     * haven't looked at, then we do need to look at those new images.
2491     */
2492    if (!stObj->needs_validation &&
2493        stObj->base.BaseLevel >= stObj->validated_first_level &&
2494        stObj->lastLevel <= stObj->validated_last_level) {
2495       return GL_TRUE;
2496    }
2497 
2498    /* If this texture comes from a window system, there is nothing else to do. */
2499    if (stObj->surface_based) {
2500       return GL_TRUE;
2501    }
2502 
2503    firstImage = st_texture_image_const(stObj->base.Image[cubeMapFace][stObj->base.BaseLevel]);
2504    assert(firstImage);
2505 
2506    /* If both firstImage and stObj point to a texture which can contain
2507     * all active images, favour firstImage.  Note that because of the
2508     * completeness requirement, we know that the image dimensions
2509     * will match.
2510     */
2511    if (firstImage->pt &&
2512        firstImage->pt != stObj->pt &&
2513        (!stObj->pt || firstImage->pt->last_level >= stObj->pt->last_level)) {
2514       pipe_resource_reference(&stObj->pt, firstImage->pt);
2515       st_texture_release_all_sampler_views(st, stObj);
2516    }
2517 
2518    /* Find gallium format for the Mesa texture */
2519    firstImageFormat =
2520       st_mesa_format_to_pipe_format(st, firstImage->base.TexFormat);
2521 
2522    /* Find size of level=0 Gallium mipmap image, plus number of texture layers */
2523    {
2524       unsigned width;
2525       uint16_t height, depth;
2526 
2527       st_gl_texture_dims_to_pipe_dims(stObj->base.Target,
2528                                       firstImage->base.Width2,
2529                                       firstImage->base.Height2,
2530                                       firstImage->base.Depth2,
2531                                       &width, &height, &depth, &ptLayers);
2532 
2533       /* If we previously allocated a pipe texture and its sizes are
2534        * compatible, use them.
2535        */
2536       if (stObj->pt &&
2537           u_minify(stObj->pt->width0, firstImage->base.Level) == width &&
2538           u_minify(stObj->pt->height0, firstImage->base.Level) == height &&
2539           u_minify(stObj->pt->depth0, firstImage->base.Level) == depth) {
2540          ptWidth = stObj->pt->width0;
2541          ptHeight = stObj->pt->height0;
2542          ptDepth = stObj->pt->depth0;
2543       } else {
2544          /* Otherwise, compute a new level=0 size that is compatible with the
2545           * base level image.
2546           */
2547          ptWidth = width > 1 ? width << firstImage->base.Level : 1;
2548          ptHeight = height > 1 ? height << firstImage->base.Level : 1;
2549          ptDepth = depth > 1 ? depth << firstImage->base.Level : 1;
2550 
2551          /* If the base level image is 1x1x1, we still need to ensure that the
2552           * resulting pipe texture ends up with the required number of levels
2553           * in total.
2554           */
2555          if (ptWidth == 1 && ptHeight == 1 && ptDepth == 1) {
2556             ptWidth <<= firstImage->base.Level;
2557 
2558             if (stObj->base.Target == GL_TEXTURE_CUBE_MAP ||
2559                 stObj->base.Target == GL_TEXTURE_CUBE_MAP_ARRAY)
2560                ptHeight = ptWidth;
2561          }
2562 
2563          /* At this point, the texture may be incomplete (mismatched cube
2564           * face sizes, for example).  If that's the case, give up, but
2565           * don't return GL_FALSE as that would raise an incorrect
2566           * GL_OUT_OF_MEMORY error.  See Piglit fbo-incomplete-texture-03 test.
2567           */
2568          if (!stObj->base._BaseComplete) {
2569             _mesa_test_texobj_completeness(ctx, &stObj->base);
2570             if (!stObj->base._BaseComplete) {
2571                return TRUE;
2572             }
2573          }
2574       }
2575 
2576       ptNumSamples = firstImage->base.NumSamples;
2577    }
2578 
2579    /* If we already have a gallium texture, check that it matches the texture
2580     * object's format, target, size, num_levels, etc.
2581     */
2582    if (stObj->pt) {
2583       if (stObj->pt->target != gl_target_to_pipe(stObj->base.Target) ||
2584           stObj->pt->format != firstImageFormat ||
2585           stObj->pt->last_level < stObj->lastLevel ||
2586           stObj->pt->width0 != ptWidth ||
2587           stObj->pt->height0 != ptHeight ||
2588           stObj->pt->depth0 != ptDepth ||
2589           stObj->pt->nr_samples != ptNumSamples ||
2590           stObj->pt->array_size != ptLayers)
2591       {
2592          /* The gallium texture does not match the Mesa texture so delete the
2593           * gallium texture now.  We'll make a new one below.
2594           */
2595          pipe_resource_reference(&stObj->pt, NULL);
2596          st_texture_release_all_sampler_views(st, stObj);
2597          st->dirty |= ST_NEW_FRAMEBUFFER;
2598       }
2599    }
2600 
2601    /* May need to create a new gallium texture:
2602     */
2603    if (!stObj->pt) {
2604       GLuint bindings = default_bindings(st, firstImageFormat);
2605 
2606       stObj->pt = st_texture_create(st,
2607                                     gl_target_to_pipe(stObj->base.Target),
2608                                     firstImageFormat,
2609                                     stObj->lastLevel,
2610                                     ptWidth,
2611                                     ptHeight,
2612                                     ptDepth,
2613                                     ptLayers, ptNumSamples,
2614                                     bindings);
2615 
2616       if (!stObj->pt) {
2617          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage");
2618          return GL_FALSE;
2619       }
2620    }
2621 
2622    /* Pull in any images not in the object's texture:
2623     */
2624    for (face = 0; face < nr_faces; face++) {
2625       GLuint level;
2626       for (level = stObj->base.BaseLevel; level <= stObj->lastLevel; level++) {
2627          struct st_texture_image *stImage =
2628             st_texture_image(stObj->base.Image[face][level]);
2629 
2630          /* Need to import images in main memory or held in other textures.
2631           */
2632          if (stImage && stObj->pt != stImage->pt) {
2633             GLuint height;
2634             GLuint depth;
2635 
2636             if (stObj->base.Target != GL_TEXTURE_1D_ARRAY)
2637                height = u_minify(ptHeight, level);
2638             else
2639                height = ptLayers;
2640 
2641             if (stObj->base.Target == GL_TEXTURE_3D)
2642                depth = u_minify(ptDepth, level);
2643             else if (stObj->base.Target == GL_TEXTURE_CUBE_MAP)
2644                depth = 1;
2645             else
2646                depth = ptLayers;
2647 
2648             if (level == 0 ||
2649                 (stImage->base.Width == u_minify(ptWidth, level) &&
2650                  stImage->base.Height == height &&
2651                  stImage->base.Depth == depth)) {
2652                /* src image fits expected dest mipmap level size */
2653                copy_image_data_to_texture(st, stObj, level, stImage);
2654             }
2655          }
2656       }
2657    }
2658 
2659    stObj->validated_first_level = stObj->base.BaseLevel;
2660    stObj->validated_last_level = stObj->lastLevel;
2661    stObj->needs_validation = false;
2662 
2663    return GL_TRUE;
2664 }
2665 
2666 /**
2667  * Allocate a new pipe_resource object
2668  * width0, height0, depth0 are the dimensions of the level 0 image
2669  * (the highest resolution).  last_level indicates how many mipmap levels
2670  * to allocate storage for.  For non-mipmapped textures, this will be zero.
2671  */
2672 static struct pipe_resource *
st_texture_create_from_memory(struct st_context * st,struct st_memory_object * memObj,GLuint64 offset,enum pipe_texture_target target,enum pipe_format format,GLuint last_level,GLuint width0,GLuint height0,GLuint depth0,GLuint layers,GLuint nr_samples,GLuint bind)2673 st_texture_create_from_memory(struct st_context *st,
2674                               struct st_memory_object *memObj,
2675                               GLuint64 offset,
2676                               enum pipe_texture_target target,
2677                               enum pipe_format format,
2678                               GLuint last_level,
2679                               GLuint width0,
2680                               GLuint height0,
2681                               GLuint depth0,
2682                               GLuint layers,
2683                               GLuint nr_samples,
2684                               GLuint bind )
2685 {
2686    struct pipe_resource pt, *newtex;
2687    struct pipe_screen *screen = st->pipe->screen;
2688 
2689    assert(target < PIPE_MAX_TEXTURE_TYPES);
2690    assert(width0 > 0);
2691    assert(height0 > 0);
2692    assert(depth0 > 0);
2693    if (target == PIPE_TEXTURE_CUBE)
2694       assert(layers == 6);
2695 
2696    DBG("%s target %d format %s last_level %d\n", __func__,
2697        (int) target, util_format_name(format), last_level);
2698 
2699    assert(format);
2700    assert(screen->is_format_supported(screen, format, target, 0,
2701                                       PIPE_BIND_SAMPLER_VIEW));
2702 
2703    memset(&pt, 0, sizeof(pt));
2704    pt.target = target;
2705    pt.format = format;
2706    pt.last_level = last_level;
2707    pt.width0 = width0;
2708    pt.height0 = height0;
2709    pt.depth0 = depth0;
2710    pt.array_size = layers;
2711    pt.usage = PIPE_USAGE_DEFAULT;
2712    pt.bind = bind;
2713    /* only set this for OpenGL textures, not renderbuffers */
2714    pt.flags = PIPE_RESOURCE_FLAG_TEXTURING_MORE_LIKELY;
2715    pt.nr_samples = nr_samples;
2716 
2717    newtex = screen->resource_from_memobj(screen, &pt, memObj->memory, offset);
2718 
2719    assert(!newtex || pipe_is_referenced(&newtex->reference));
2720 
2721    return newtex;
2722 }
2723 
2724 /**
2725  * Allocate texture memory for a whole mipmap stack.
2726  * Note: for multisample textures if the requested sample count is not
2727  * supported, we search for the next higher supported sample count.
2728  */
2729 static GLboolean
st_texture_storage(struct gl_context * ctx,struct gl_texture_object * texObj,GLsizei levels,GLsizei width,GLsizei height,GLsizei depth,struct gl_memory_object * memObj,GLuint64 offset)2730 st_texture_storage(struct gl_context *ctx,
2731                    struct gl_texture_object *texObj,
2732                    GLsizei levels, GLsizei width,
2733                    GLsizei height, GLsizei depth,
2734                    struct gl_memory_object *memObj,
2735                    GLuint64 offset)
2736 {
2737    const GLuint numFaces = _mesa_num_tex_faces(texObj->Target);
2738    struct gl_texture_image *texImage = texObj->Image[0][0];
2739    struct st_context *st = st_context(ctx);
2740    struct st_texture_object *stObj = st_texture_object(texObj);
2741    struct st_memory_object *smObj = st_memory_object(memObj);
2742    struct pipe_screen *screen = st->pipe->screen;
2743    unsigned ptWidth, bindings;
2744    uint16_t ptHeight, ptDepth, ptLayers;
2745    enum pipe_format fmt;
2746    GLint level;
2747    GLuint num_samples = texImage->NumSamples;
2748 
2749    assert(levels > 0);
2750 
2751    stObj->lastLevel = levels - 1;
2752 
2753    fmt = st_mesa_format_to_pipe_format(st, texImage->TexFormat);
2754 
2755    bindings = default_bindings(st, fmt);
2756 
2757    if (num_samples > 0) {
2758       /* Find msaa sample count which is actually supported.  For example,
2759        * if the user requests 1x but only 4x or 8x msaa is supported, we'll
2760        * choose 4x here.
2761        */
2762       enum pipe_texture_target ptarget = gl_target_to_pipe(texObj->Target);
2763       boolean found = FALSE;
2764 
2765       if (ctx->Const.MaxSamples > 1 && num_samples == 1) {
2766          /* don't try num_samples = 1 with drivers that support real msaa */
2767          num_samples = 2;
2768       }
2769 
2770       for (; num_samples <= ctx->Const.MaxSamples; num_samples++) {
2771          if (screen->is_format_supported(screen, fmt, ptarget,
2772                                          num_samples,
2773                                          PIPE_BIND_SAMPLER_VIEW)) {
2774             /* Update the sample count in gl_texture_image as well. */
2775             texImage->NumSamples = num_samples;
2776             found = TRUE;
2777             break;
2778          }
2779       }
2780 
2781       if (!found) {
2782          return GL_FALSE;
2783       }
2784    }
2785 
2786    st_gl_texture_dims_to_pipe_dims(texObj->Target,
2787                                    width, height, depth,
2788                                    &ptWidth, &ptHeight, &ptDepth, &ptLayers);
2789 
2790    if (smObj) {
2791       stObj->pt = st_texture_create_from_memory(st,
2792                                                 smObj,
2793                                                 offset,
2794                                                 gl_target_to_pipe(texObj->Target),
2795                                                 fmt,
2796                                                 levels - 1,
2797                                                 ptWidth,
2798                                                 ptHeight,
2799                                                 ptDepth,
2800                                                 ptLayers, num_samples,
2801                                                 bindings);
2802    }
2803    else {
2804       stObj->pt = st_texture_create(st,
2805                                     gl_target_to_pipe(texObj->Target),
2806                                     fmt,
2807                                     levels - 1,
2808                                     ptWidth,
2809                                     ptHeight,
2810                                     ptDepth,
2811                                     ptLayers, num_samples,
2812                                     bindings);
2813    }
2814 
2815    if (!stObj->pt)
2816       return GL_FALSE;
2817 
2818    /* Set image resource pointers */
2819    for (level = 0; level < levels; level++) {
2820       GLuint face;
2821       for (face = 0; face < numFaces; face++) {
2822          struct st_texture_image *stImage =
2823             st_texture_image(texObj->Image[face][level]);
2824          pipe_resource_reference(&stImage->pt, stObj->pt);
2825 
2826          etc_fallback_allocate(st, stImage);
2827       }
2828    }
2829 
2830    /* The texture is in a validated state, so no need to check later. */
2831    stObj->needs_validation = false;
2832    stObj->validated_first_level = 0;
2833    stObj->validated_last_level = levels - 1;
2834 
2835    return GL_TRUE;
2836 }
2837 
2838 /**
2839  * Called via ctx->Driver.AllocTextureStorage() to allocate texture memory
2840  * for a whole mipmap stack.
2841  */
2842 static GLboolean
st_AllocTextureStorage(struct gl_context * ctx,struct gl_texture_object * texObj,GLsizei levels,GLsizei width,GLsizei height,GLsizei depth)2843 st_AllocTextureStorage(struct gl_context *ctx,
2844                        struct gl_texture_object *texObj,
2845                        GLsizei levels, GLsizei width,
2846                        GLsizei height, GLsizei depth)
2847 {
2848    return st_texture_storage(ctx, texObj, levels,
2849                              width, height, depth,
2850                              NULL, 0);
2851 }
2852 
2853 
2854 static GLboolean
st_TestProxyTexImage(struct gl_context * ctx,GLenum target,GLuint numLevels,GLint level,mesa_format format,GLuint numSamples,GLint width,GLint height,GLint depth)2855 st_TestProxyTexImage(struct gl_context *ctx, GLenum target,
2856                      GLuint numLevels, GLint level,
2857                      mesa_format format, GLuint numSamples,
2858                      GLint width, GLint height, GLint depth)
2859 {
2860    struct st_context *st = st_context(ctx);
2861    struct pipe_context *pipe = st->pipe;
2862 
2863    if (width == 0 || height == 0 || depth == 0) {
2864       /* zero-sized images are legal, and always fit! */
2865       return GL_TRUE;
2866    }
2867 
2868    if (pipe->screen->can_create_resource) {
2869       /* Ask the gallium driver if the texture is too large */
2870       struct gl_texture_object *texObj =
2871          _mesa_get_current_tex_object(ctx, target);
2872       struct pipe_resource pt;
2873 
2874       /* Setup the pipe_resource object
2875        */
2876       memset(&pt, 0, sizeof(pt));
2877 
2878       pt.target = gl_target_to_pipe(target);
2879       pt.format = st_mesa_format_to_pipe_format(st, format);
2880       pt.nr_samples = numSamples;
2881 
2882       st_gl_texture_dims_to_pipe_dims(target,
2883                                       width, height, depth,
2884                                       &pt.width0, &pt.height0,
2885                                       &pt.depth0, &pt.array_size);
2886 
2887       if (numLevels > 0) {
2888          /* For immutable textures we know the final number of mip levels */
2889          pt.last_level = numLevels - 1;
2890       }
2891       else if (level == 0 && (texObj->Sampler.MinFilter == GL_LINEAR ||
2892                               texObj->Sampler.MinFilter == GL_NEAREST)) {
2893          /* assume just one mipmap level */
2894          pt.last_level = 0;
2895       }
2896       else {
2897          /* assume a full set of mipmaps */
2898          pt.last_level = _mesa_logbase2(MAX3(width, height, depth));
2899       }
2900 
2901       return pipe->screen->can_create_resource(pipe->screen, &pt);
2902    }
2903    else {
2904       /* Use core Mesa fallback */
2905       return _mesa_test_proxy_teximage(ctx, target, numLevels, level, format,
2906                                        numSamples, width, height, depth);
2907    }
2908 }
2909 
2910 static GLboolean
st_TextureView(struct gl_context * ctx,struct gl_texture_object * texObj,struct gl_texture_object * origTexObj)2911 st_TextureView(struct gl_context *ctx,
2912                struct gl_texture_object *texObj,
2913                struct gl_texture_object *origTexObj)
2914 {
2915    struct st_context *st = st_context(ctx);
2916    struct st_texture_object *orig = st_texture_object(origTexObj);
2917    struct st_texture_object *tex = st_texture_object(texObj);
2918    struct gl_texture_image *image = texObj->Image[0][0];
2919 
2920    const int numFaces = _mesa_num_tex_faces(texObj->Target);
2921    const int numLevels = texObj->NumLevels;
2922 
2923    int face;
2924    int level;
2925 
2926    pipe_resource_reference(&tex->pt, orig->pt);
2927 
2928    /* Set image resource pointers */
2929    for (level = 0; level < numLevels; level++) {
2930       for (face = 0; face < numFaces; face++) {
2931          struct st_texture_image *stImage =
2932             st_texture_image(texObj->Image[face][level]);
2933          pipe_resource_reference(&stImage->pt, tex->pt);
2934       }
2935    }
2936 
2937    tex->surface_based = GL_TRUE;
2938    tex->surface_format =
2939       st_mesa_format_to_pipe_format(st_context(ctx), image->TexFormat);
2940 
2941    tex->lastLevel = numLevels - 1;
2942 
2943    /* free texture sampler views.  They need to be recreated when we
2944     * change the texture view parameters.
2945     */
2946    st_texture_release_all_sampler_views(st, tex);
2947 
2948    /* The texture is in a validated state, so no need to check later. */
2949    tex->needs_validation = false;
2950    tex->validated_first_level = 0;
2951    tex->validated_last_level = numLevels - 1;
2952 
2953    return GL_TRUE;
2954 }
2955 
2956 
2957 /**
2958  * Find the mipmap level in 'pt' which matches the level described by
2959  * 'texImage'.
2960  */
2961 static unsigned
find_mipmap_level(const struct gl_texture_image * texImage,const struct pipe_resource * pt)2962 find_mipmap_level(const struct gl_texture_image *texImage,
2963                   const struct pipe_resource *pt)
2964 {
2965    const GLenum target = texImage->TexObject->Target;
2966    GLint texWidth = texImage->Width;
2967    GLint texHeight = texImage->Height;
2968    GLint texDepth = texImage->Depth;
2969    unsigned level, w;
2970    uint16_t h, d, layers;
2971 
2972    st_gl_texture_dims_to_pipe_dims(target, texWidth, texHeight, texDepth,
2973                                    &w, &h, &d, &layers);
2974 
2975    for (level = 0; level <= pt->last_level; level++) {
2976       if (u_minify(pt->width0, level) == w &&
2977           u_minify(pt->height0, level) == h &&
2978           u_minify(pt->depth0, level) == d) {
2979          return level;
2980       }
2981    }
2982 
2983    /* If we get here, there must be some sort of inconsistency between
2984     * the Mesa texture object/images and the gallium resource.
2985     */
2986    debug_printf("Inconsistent textures in find_mipmap_level()\n");
2987 
2988    return texImage->Level;
2989 }
2990 
2991 
2992 static void
st_ClearTexSubImage(struct gl_context * ctx,struct gl_texture_image * texImage,GLint xoffset,GLint yoffset,GLint zoffset,GLsizei width,GLsizei height,GLsizei depth,const void * clearValue)2993 st_ClearTexSubImage(struct gl_context *ctx,
2994                     struct gl_texture_image *texImage,
2995                     GLint xoffset, GLint yoffset, GLint zoffset,
2996                     GLsizei width, GLsizei height, GLsizei depth,
2997                     const void *clearValue)
2998 {
2999    static const char zeros[16] = {0};
3000    struct gl_texture_object *texObj = texImage->TexObject;
3001    struct st_texture_image *stImage = st_texture_image(texImage);
3002    struct pipe_resource *pt = stImage->pt;
3003    struct st_context *st = st_context(ctx);
3004    struct pipe_context *pipe = st->pipe;
3005    unsigned level;
3006    struct pipe_box box;
3007 
3008    if (!pt)
3009       return;
3010 
3011    st_flush_bitmap_cache(st);
3012    st_invalidate_readpix_cache(st);
3013 
3014    u_box_3d(xoffset, yoffset, zoffset + texImage->Face,
3015             width, height, depth, &box);
3016    if (texObj->Immutable) {
3017       /* The texture object has to be consistent (no "loose", per-image
3018        * gallium resources).  If this texture is a view into another
3019        * texture, we have to apply the MinLevel/Layer offsets.  If this is
3020        * not a texture view, the offsets will be zero.
3021        */
3022       assert(stImage->pt == st_texture_object(texObj)->pt);
3023       level = texImage->Level + texObj->MinLevel;
3024       box.z += texObj->MinLayer;
3025    }
3026    else {
3027       /* Texture level sizes may be inconsistent.  We my have "loose",
3028        * per-image gallium resources.  The texImage->Level may not match
3029        * the gallium resource texture level.
3030        */
3031       level = find_mipmap_level(texImage, pt);
3032    }
3033 
3034    assert(level <= pt->last_level);
3035 
3036    pipe->clear_texture(pipe, pt, level, &box, clearValue ? clearValue : zeros);
3037 }
3038 
3039 
3040 /**
3041  * Called via the glTexParam*() function, but only when some texture object
3042  * state has actually changed.
3043  */
3044 static void
st_TexParameter(struct gl_context * ctx,struct gl_texture_object * texObj,GLenum pname)3045 st_TexParameter(struct gl_context *ctx,
3046                 struct gl_texture_object *texObj, GLenum pname)
3047 {
3048    struct st_context *st = st_context(ctx);
3049    struct st_texture_object *stObj = st_texture_object(texObj);
3050 
3051    switch (pname) {
3052    case GL_TEXTURE_BASE_LEVEL:
3053    case GL_TEXTURE_MAX_LEVEL:
3054    case GL_DEPTH_TEXTURE_MODE:
3055    case GL_DEPTH_STENCIL_TEXTURE_MODE:
3056    case GL_TEXTURE_SRGB_DECODE_EXT:
3057    case GL_TEXTURE_SWIZZLE_R:
3058    case GL_TEXTURE_SWIZZLE_G:
3059    case GL_TEXTURE_SWIZZLE_B:
3060    case GL_TEXTURE_SWIZZLE_A:
3061    case GL_TEXTURE_SWIZZLE_RGBA:
3062    case GL_TEXTURE_BUFFER_SIZE:
3063    case GL_TEXTURE_BUFFER_OFFSET:
3064       /* changing any of these texture parameters means we must create
3065        * new sampler views.
3066        */
3067       st_texture_release_all_sampler_views(st, stObj);
3068       break;
3069    default:
3070       ; /* nothing */
3071    }
3072 }
3073 
3074 static GLboolean
st_SetTextureStorageForMemoryObject(struct gl_context * ctx,struct gl_texture_object * texObj,struct gl_memory_object * memObj,GLsizei levels,GLsizei width,GLsizei height,GLsizei depth,GLuint64 offset)3075 st_SetTextureStorageForMemoryObject(struct gl_context *ctx,
3076                                     struct gl_texture_object *texObj,
3077                                     struct gl_memory_object *memObj,
3078                                     GLsizei levels, GLsizei width,
3079                                     GLsizei height, GLsizei depth,
3080                                     GLuint64 offset)
3081 {
3082    return st_texture_storage(ctx, texObj, levels,
3083                              width, height, depth,
3084                              memObj, offset);
3085 }
3086 
3087 static GLuint64
st_NewTextureHandle(struct gl_context * ctx,struct gl_texture_object * texObj,struct gl_sampler_object * sampObj)3088 st_NewTextureHandle(struct gl_context *ctx, struct gl_texture_object *texObj,
3089                     struct gl_sampler_object *sampObj)
3090 {
3091    struct st_context *st = st_context(ctx);
3092    struct st_texture_object *stObj = st_texture_object(texObj);
3093    struct pipe_context *pipe = st->pipe;
3094    struct pipe_sampler_view *view;
3095    struct pipe_sampler_state sampler = {0};
3096 
3097    if (texObj->Target != GL_TEXTURE_BUFFER) {
3098       if (!st_finalize_texture(ctx, pipe, texObj, 0))
3099          return 0;
3100 
3101       st_convert_sampler(st, texObj, sampObj, 0, &sampler);
3102 
3103       /* TODO: Clarify the interaction of ARB_bindless_texture and EXT_texture_sRGB_decode */
3104       view = st_get_texture_sampler_view_from_stobj(st, stObj, sampObj, 0, true);
3105    } else {
3106       view = st_get_buffer_sampler_view_from_stobj(st, stObj);
3107    }
3108 
3109    return pipe->create_texture_handle(pipe, view, &sampler);
3110 }
3111 
3112 
3113 static void
st_DeleteTextureHandle(struct gl_context * ctx,GLuint64 handle)3114 st_DeleteTextureHandle(struct gl_context *ctx, GLuint64 handle)
3115 {
3116    struct st_context *st = st_context(ctx);
3117    struct pipe_context *pipe = st->pipe;
3118 
3119    pipe->delete_texture_handle(pipe, handle);
3120 }
3121 
3122 
3123 static void
st_MakeTextureHandleResident(struct gl_context * ctx,GLuint64 handle,bool resident)3124 st_MakeTextureHandleResident(struct gl_context *ctx, GLuint64 handle,
3125                              bool resident)
3126 {
3127    struct st_context *st = st_context(ctx);
3128    struct pipe_context *pipe = st->pipe;
3129 
3130    pipe->make_texture_handle_resident(pipe, handle, resident);
3131 }
3132 
3133 
3134 static GLuint64
st_NewImageHandle(struct gl_context * ctx,struct gl_image_unit * imgObj)3135 st_NewImageHandle(struct gl_context *ctx, struct gl_image_unit *imgObj)
3136 {
3137    struct st_context *st = st_context(ctx);
3138    struct pipe_context *pipe = st->pipe;
3139    struct pipe_image_view image;
3140 
3141    st_convert_image(st, imgObj, &image);
3142 
3143    return pipe->create_image_handle(pipe, &image);
3144 }
3145 
3146 
3147 static void
st_DeleteImageHandle(struct gl_context * ctx,GLuint64 handle)3148 st_DeleteImageHandle(struct gl_context *ctx, GLuint64 handle)
3149 {
3150    struct st_context *st = st_context(ctx);
3151    struct pipe_context *pipe = st->pipe;
3152 
3153    pipe->delete_image_handle(pipe, handle);
3154 }
3155 
3156 
3157 static void
st_MakeImageHandleResident(struct gl_context * ctx,GLuint64 handle,GLenum access,bool resident)3158 st_MakeImageHandleResident(struct gl_context *ctx, GLuint64 handle,
3159                            GLenum access, bool resident)
3160 {
3161    struct st_context *st = st_context(ctx);
3162    struct pipe_context *pipe = st->pipe;
3163 
3164    pipe->make_image_handle_resident(pipe, handle, access, resident);
3165 }
3166 
3167 
3168 void
st_init_texture_functions(struct dd_function_table * functions)3169 st_init_texture_functions(struct dd_function_table *functions)
3170 {
3171    functions->ChooseTextureFormat = st_ChooseTextureFormat;
3172    functions->QueryInternalFormat = st_QueryInternalFormat;
3173    functions->TexImage = st_TexImage;
3174    functions->TexSubImage = st_TexSubImage;
3175    functions->CompressedTexSubImage = st_CompressedTexSubImage;
3176    functions->CopyTexSubImage = st_CopyTexSubImage;
3177    functions->GenerateMipmap = st_generate_mipmap;
3178 
3179    functions->GetTexSubImage = st_GetTexSubImage;
3180 
3181    /* compressed texture functions */
3182    functions->CompressedTexImage = st_CompressedTexImage;
3183 
3184    functions->NewTextureObject = st_NewTextureObject;
3185    functions->NewTextureImage = st_NewTextureImage;
3186    functions->DeleteTextureImage = st_DeleteTextureImage;
3187    functions->DeleteTexture = st_DeleteTextureObject;
3188    functions->AllocTextureImageBuffer = st_AllocTextureImageBuffer;
3189    functions->FreeTextureImageBuffer = st_FreeTextureImageBuffer;
3190    functions->MapTextureImage = st_MapTextureImage;
3191    functions->UnmapTextureImage = st_UnmapTextureImage;
3192 
3193    /* XXX Temporary until we can query pipe's texture sizes */
3194    functions->TestProxyTexImage = st_TestProxyTexImage;
3195 
3196    functions->AllocTextureStorage = st_AllocTextureStorage;
3197    functions->TextureView = st_TextureView;
3198    functions->ClearTexSubImage = st_ClearTexSubImage;
3199 
3200    functions->TexParameter = st_TexParameter;
3201 
3202    /* bindless functions */
3203    functions->NewTextureHandle = st_NewTextureHandle;
3204    functions->DeleteTextureHandle = st_DeleteTextureHandle;
3205    functions->MakeTextureHandleResident = st_MakeTextureHandleResident;
3206    functions->NewImageHandle = st_NewImageHandle;
3207    functions->DeleteImageHandle = st_DeleteImageHandle;
3208    functions->MakeImageHandleResident = st_MakeImageHandleResident;
3209 
3210    /* external object functions */
3211    functions->SetTextureStorageForMemoryObject = st_SetTextureStorageForMemoryObject;
3212 }
3213