st_cb_texture.c revision 9b56a2cb626b254bcb7b7202e6babd1b5570208f
124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/************************************************************************** 224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * All Rights Reserved. 524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Permission is hereby granted, free of charge, to any person obtaining a 724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * copy of this software and associated documentation files (the 824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * "Software"), to deal in the Software without restriction, including 924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * without limitation the rights to use, copy, modify, merge, publish, 1024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * distribute, sub license, and/or sell copies of the Software, and to 1124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * permit persons to whom the Software is furnished to do so, subject to 1224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * the following conditions: 1324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 1424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * The above copyright notice and this permission notice (including the 1524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * next paragraph) shall be included in all copies or substantial portions 1624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * of the Software. 1724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 1824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 2624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian **************************************************************************/ 2724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 28f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul#include "main/mfeatures.h" 297b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul#include "main/bufferobj.h" 3024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/enums.h" 3165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul#include "main/fbobject.h" 3245e76d2665b38ba3787548310efc59e969124c01Brian Paul#include "main/formats.h" 3324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/image.h" 34f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul#include "main/imports.h" 3524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/macros.h" 362440ff74d69a8caf49b05a960b4c7e282a96565eBrian#include "main/mipmap.h" 371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "main/pack.h" 381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "main/pixeltransfer.h" 3924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texcompress.h" 404ca9ba254462b9be55b78df1d50519e10b2f4d73Brian Paul#include "main/texfetch.h" 41a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul#include "main/texgetimage.h" 4224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/teximage.h" 4324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texobj.h" 4424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texstore.h" 4524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 46b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell#include "state_tracker/st_debug.h" 4724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "state_tracker/st_context.h" 48b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian#include "state_tracker/st_cb_fbo.h" 49b0427bedde80e3189524651a327235bdfddbc613José Fonseca#include "state_tracker/st_cb_flush.h" 5024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "state_tracker/st_cb_texture.h" 51f8ab24760d0d3f07e9ee81c98207ddf92dfe74daBrian#include "state_tracker/st_format.h" 52753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer#include "state_tracker/st_texture.h" 5362abcb9aacc33218d0143a743c738435794b32a9Brian#include "state_tracker/st_gen_mipmap.h" 54afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell#include "state_tracker/st_atom.h" 5524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 5624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "pipe/p_context.h" 57b245840b86cf877c9b8d666edf229364a84f1deaBrian#include "pipe/p_defines.h" 5828486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 598fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell#include "pipe/p_shader_tokens.h" 604f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_tile.h" 613c0dc8242b64518d5635263ba65b39afa919dd86Michel Dänzer#include "util/u_blit.h" 623400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol#include "util/u_format.h" 6351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul#include "util/u_surface.h" 648f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger#include "util/u_sampler.h" 65c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin#include "util/u_math.h" 664c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger#include "util/u_box.h" 6724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 6824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#define DBG if (0) printf 6924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 7024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 711c5f27a18b775b3784fcd265d60e0affa0b31581Michel Dänzerstatic enum pipe_texture_target 725390a43ce06b27f6d54bc5f237aa305b6948f2afBriangl_target_to_pipe(GLenum target) 735390a43ce06b27f6d54bc5f237aa305b6948f2afBrian{ 745390a43ce06b27f6d54bc5f237aa305b6948f2afBrian switch (target) { 755390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_1D: 765390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_1D; 775390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_2D: 785390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_2D; 797f15dca6d963b0a69131e8761c477064dba49307Luca Barbieri case GL_TEXTURE_RECTANGLE_NV: 807f15dca6d963b0a69131e8761c477064dba49307Luca Barbieri return PIPE_TEXTURE_RECT; 815390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_3D: 825390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_3D; 835390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_CUBE_MAP_ARB: 845390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_CUBE; 859b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul case GL_TEXTURE_1D_ARRAY_EXT: 869b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul return PIPE_TEXTURE_1D_ARRAY; 879b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul case GL_TEXTURE_2D_ARRAY_EXT: 889b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul return PIPE_TEXTURE_2D_ARRAY; 895390a43ce06b27f6d54bc5f237aa305b6948f2afBrian default: 905390a43ce06b27f6d54bc5f237aa305b6948f2afBrian assert(0); 915390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return 0; 925390a43ce06b27f6d54bc5f237aa305b6948f2afBrian } 935390a43ce06b27f6d54bc5f237aa305b6948f2afBrian} 945390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 955390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 964e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.NewTextureImage() */ 9724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic struct gl_texture_image * 98f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_NewTextureImage(struct gl_context * ctx) 9924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 10024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 10124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (void) ctx; 102f1a59a6dd7b7b0523db191d82b3af1a841c6475dBrian Paul return (struct gl_texture_image *) ST_CALLOC_STRUCT(st_texture_image); 10324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 10424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 10524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1064e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.NewTextureObject() */ 10724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic struct gl_texture_object * 108f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_NewTextureObject(struct gl_context * ctx, GLuint name, GLenum target) 10924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 110f1a59a6dd7b7b0523db191d82b3af1a841c6475dBrian Paul struct st_texture_object *obj = ST_CALLOC_STRUCT(st_texture_object); 11124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 11324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_initialize_texture_object(&obj->base, name, target); 11424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &obj->base; 11624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 11724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11830f46e7b4c9d6c6f8c1c01825b344b90adc93982Brian Paul/** called via ctx->Driver.DeleteTextureObject() */ 11924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 120f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_DeleteTextureObject(struct gl_context *ctx, 1216f715dcc219071e574e363a9db4365c9c31ebbd3Brian struct gl_texture_object *texObj) 12224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 12376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 12424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_object *stObj = st_texture_object(texObj); 125753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stObj->pt) 126287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 1272d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul if (stObj->sampler_view) { 12876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul if (stObj->sampler_view->context != st->pipe) { 1292d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul /* Take "ownership" of this texture sampler view by setting 1302d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul * its context pointer to this context. This avoids potential 1312d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul * crashes when the texture object is shared among contexts 1322d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul * and the original/owner context has already been destroyed. 1332d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul */ 13476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul stObj->sampler_view->context = st->pipe; 1352d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul } 136b8030c6561e019e079b5be2fe64ec804df4bfa03Michal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 1372d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul } 13824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_delete_texture_object(ctx, texObj); 13924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 14024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 14124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1424e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.FreeTexImageData() */ 14324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 144f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_FreeTextureImageData(struct gl_context * ctx, struct gl_texture_image *texImage) 14524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 14624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 14724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 14824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 14924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 150753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 151287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 15224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 15324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 15424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (texImage->Data) { 1558d6ef125ac6044438db5b89d6d310ccfc4b8140aBrian Paul _mesa_align_free(texImage->Data); 15624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 15724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 15824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 15924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 16024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1614e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** 16224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * From linux kernel i386 header files, copes with odd sizes better 16324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * than COPY_DWORDS would: 16424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * XXX Put this in src/mesa/main/imports.h ??? 16524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1661ea7f0fef055245fa18c0fbc3e54a866956c2507José Fonseca#if defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86) 16724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic INLINE void * 16824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian__memcpy(void *to, const void *from, size_t n) 16924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 17024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian int d0, d1, d2; 17124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian __asm__ __volatile__("rep ; movsl\n\t" 17224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "testb $2,%b4\n\t" 17324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "je 1f\n\t" 17424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "movsw\n" 17524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "1:\ttestb $1,%b4\n\t" 17624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "je 2f\n\t" 17724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "movsb\n" "2:":"=&c"(d0), "=&D"(d1), "=&S"(d2) 17824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian :"0"(n / 4), "q"(n), "1"((long) to), "2"((long) from) 17924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian :"memory"); 18024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return (to); 18124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 18224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#else 18324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#define __memcpy(a,b,c) memcpy(a,b,c) 18424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 18524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 18624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1874e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** 1884e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * The system memcpy (at least on ubuntu 5.10) has problems copying 18924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * to agp (writecombined) memory from a source which isn't 64-byte 19024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * aligned - there is a 4x performance falloff. 19124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 19224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * The x86 __memcpy is immune to this but is slightly slower 19324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * (10%-ish) than the system memcpy. 19424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 19524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * The sse_memcpy seems to have a slight cliff at 64/32 bytes, but 19624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * isn't much faster than x86_memcpy for agp copies. 19724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 19824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * TODO: switch dynamically. 19924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 20024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void * 20124df8f895fe8807aa2ba058e71bd40adfc01d21eBriando_memcpy(void *dest, const void *src, size_t n) 20224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 203799f55803d15602b10d2bb97ff62792f05ce4de3Brian Paul if ((((unsigned long) src) & 63) || (((unsigned long) dest) & 63)) { 20424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return __memcpy(dest, src, n); 20524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 20624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else 20724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return memcpy(dest, src, n); 20824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 20924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 21024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 211f52f5136e6eed23e55098681e5b082cc452136d6Brian/** 2128283db88414f600e66510de713382c36899d4b03Brian Paul * Return default texture resource binding bitmask for the given format. 2131ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul */ 2141ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paulstatic GLuint 2158283db88414f600e66510de713382c36899d4b03Brian Pauldefault_bindings(struct st_context *st, enum pipe_format format) 2161ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul{ 2178283db88414f600e66510de713382c36899d4b03Brian Paul struct pipe_screen *screen = st->pipe->screen; 2188283db88414f600e66510de713382c36899d4b03Brian Paul const unsigned target = PIPE_TEXTURE_2D; 2198283db88414f600e66510de713382c36899d4b03Brian Paul const unsigned geom = 0x0; 2208283db88414f600e66510de713382c36899d4b03Brian Paul unsigned bindings; 2218283db88414f600e66510de713382c36899d4b03Brian Paul 2228283db88414f600e66510de713382c36899d4b03Brian Paul if (util_format_is_depth_or_stencil(format)) 2238283db88414f600e66510de713382c36899d4b03Brian Paul bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_DEPTH_STENCIL; 2248283db88414f600e66510de713382c36899d4b03Brian Paul else 2258283db88414f600e66510de713382c36899d4b03Brian Paul bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET; 2268283db88414f600e66510de713382c36899d4b03Brian Paul 227127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger if (screen->is_format_supported(screen, format, target, 0, bindings, geom)) 2288283db88414f600e66510de713382c36899d4b03Brian Paul return bindings; 2291ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul else 2308283db88414f600e66510de713382c36899d4b03Brian Paul return PIPE_BIND_SAMPLER_VIEW; 2311ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul} 2321ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 2331ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 234e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul/** Return number of image dimensions (1, 2 or 3) for a texture target. */ 235e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paulstatic GLuint 236e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paulget_texture_dims(GLenum target) 237e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul{ 238e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul switch (target) { 239e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_1D: 240e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_1D_ARRAY_EXT: 241e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 1; 242e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_2D: 243e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_CUBE_MAP_ARB: 244168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 245168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 246168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 247168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 248168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 249168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 250e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_RECTANGLE_NV: 251e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_2D_ARRAY_EXT: 252e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 2; 253e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_3D: 254e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 3; 255e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul default: 256e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(0 && "invalid texture target in get_texture_dims()"); 257e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 1; 258e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 259e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul} 260e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 261e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 2621ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul/** 263e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * Try to allocate a pipe_resource object for the given st_texture_object. 264f52f5136e6eed23e55098681e5b082cc452136d6Brian * 265e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * We use the given st_texture_image as a clue to determine the size of the 266e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * mipmap image at level=0. 2672b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul * 2682b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul * \return GL_TRUE for success, GL_FALSE if out of memory. 26924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 2702b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paulstatic GLboolean 271753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzerguess_and_alloc_texture(struct st_context *st, 272753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_object *stObj, 273afc54983370033b65e3a7cbb29bd9c87156f0881Brian const struct st_texture_image *stImage) 27424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 275e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul const GLuint dims = get_texture_dims(stObj->base.Target); 276e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint level, lastLevel, width, height, depth; 277e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint bindings; 278a1f95a8bf64f863289b6759caeec76d7e054400eRoland Scheidegger enum pipe_format fmt; 27924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 28024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 28124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 282f52f5136e6eed23e55098681e5b082cc452136d6Brian assert(!stObj->pt); 283f52f5136e6eed23e55098681e5b082cc452136d6Brian 284e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul level = stImage->level; 285e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul width = stImage->base.Width2; /* size w/out border */ 286e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul height = stImage->base.Height2; 287e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul depth = stImage->base.Depth2; 28824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 289e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(width > 0); 290e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(height > 0); 291e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(depth > 0); 29224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 293e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Depending on the image's size, we can't always make a guess here. 29424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 295e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if (level > 0) { 296e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if ( (dims >= 1 && width == 1) || 297e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul (dims >= 2 && height == 1) || 298e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul (dims >= 3 && depth == 1) ) { 299e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* we can't determine the image size at level=0 */ 300e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0 = stObj->height0 = stObj->depth0 = 0; 3012b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul /* this is not an out of memory error */ 3022b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul return GL_TRUE; 303e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 304e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 305e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 306e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* grow the image size until we hit level = 0 */ 307e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul while (level > 0) { 30845cc35e77600af8628393475405160e26d56d421Brian Paul if (width != 1) 30945cc35e77600af8628393475405160e26d56d421Brian Paul width <<= 1; 31024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (height != 1) 31124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian height <<= 1; 31224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (depth != 1) 31324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian depth <<= 1; 314e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul level--; 315e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 31624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 317e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(level == 0); 318e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 319e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* At this point, (width x height x depth) is the expected size of 320e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * the level=0 mipmap image. 321e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 322296378b6c8b205048244746e260739448c4ee590Brian Paul 3234b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul /* Guess a reasonable value for lastLevel. With OpenGL we have no 3244b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * idea how many mipmap levels will be in a texture until we start 3254b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * to render with it. Make an educated guess here but be prepared 3264b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * to re-allocating a texture buffer with space for more (or fewer) 3274b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * mipmap levels later. 32824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 32914b98343309fdcff3514f05020303f7b40e83a4aBrian if ((stObj->base.MinFilter == GL_NEAREST || 3302a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stObj->base.MinFilter == GL_LINEAR || 3312a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stImage->base._BaseFormat == GL_DEPTH_COMPONENT || 3322a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stImage->base._BaseFormat == GL_DEPTH_STENCIL_EXT) && 33305bad193f56d48384097e37e47fae3fdda85f144Brian Paul !stObj->base.GenerateMipmap && 334e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stImage->level == 0) { 33505bad193f56d48384097e37e47fae3fdda85f144Brian Paul /* only alloc space for a single mipmap level */ 336e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul lastLevel = 0; 33724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 33824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 33905bad193f56d48384097e37e47fae3fdda85f144Brian Paul /* alloc space for a full mipmap */ 340c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2width = util_logbase2(width); 341c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2height = util_logbase2(height); 342c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2depth = util_logbase2(depth); 343e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul lastLevel = MAX2(MAX2(l2width, l2height), l2depth); 34424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 34524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 346e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Save the level=0 dimensions */ 347e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0 = width; 348e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->height0 = height; 349e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->depth0 = depth; 350e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 3511f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul fmt = st_mesa_format_to_pipe_format(stImage->base.TexFormat); 3521ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 3538283db88414f600e66510de713382c36899d4b03Brian Paul bindings = default_bindings(st, fmt); 3541ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 355753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer stObj->pt = st_texture_create(st, 3565390a43ce06b27f6d54bc5f237aa305b6948f2afBrian gl_target_to_pipe(stObj->base.Target), 357a1f95a8bf64f863289b6759caeec76d7e054400eRoland Scheidegger fmt, 3585390a43ce06b27f6d54bc5f237aa305b6948f2afBrian lastLevel, 3595390a43ce06b27f6d54bc5f237aa305b6948f2afBrian width, 3605390a43ce06b27f6d54bc5f237aa305b6948f2afBrian height, 3615390a43ce06b27f6d54bc5f237aa305b6948f2afBrian depth, 3628283db88414f600e66510de713382c36899d4b03Brian Paul bindings); 36324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 3642b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul DBG("%s returning %d\n", __FUNCTION__, (stObj->pt != NULL)); 3652b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul 3662b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul return stObj->pt != NULL; 36724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 36824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 36924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 370212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian/** 371212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * Adjust pixel unpack params and image dimensions to strip off the 372212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * texture border. 373212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * Gallium doesn't support texture borders. They've seldem been used 374212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * and seldom been implemented correctly anyway. 375212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * \param unpackNew returns the new pixel unpack parameters 376212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian */ 377212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brianstatic void 378212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brianstrip_texture_border(GLint border, 379212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian GLint *width, GLint *height, GLint *depth, 380212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian const struct gl_pixelstore_attrib *unpack, 381212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian struct gl_pixelstore_attrib *unpackNew) 382212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian{ 383212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian assert(border > 0); /* sanity check */ 384212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 385212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *unpackNew = *unpack; 386212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 387212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (unpackNew->RowLength == 0) 388212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->RowLength = *width; 389212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 390212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth && unpackNew->ImageHeight == 0) 391212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->ImageHeight = *height; 392212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 393212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipPixels += border; 394212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (height) 395212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipRows += border; 396212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth) 397212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipImages += border; 398212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 399212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian assert(*width >= 3); 400212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *width = *width - 2 * border; 401212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (height && *height >= 3) 402212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *height = *height - 2 * border; 403212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth && *depth >= 3) 404212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *depth = *depth - 2 * border; 405212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian} 406212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 40724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 4084e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** 40955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * Try to do texture compression via rendering. If the Gallium driver 41055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * can render into a compressed surface this will allow us to do texture 41155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * compression. 41255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * \return GL_TRUE for success, GL_FALSE for failure 41355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 41455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantzstatic GLboolean 415f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcompress_with_blit(struct gl_context * ctx, 41655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLenum target, GLint level, 41755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLint xoffset, GLint yoffset, GLint zoffset, 41855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLint width, GLint height, GLint depth, 41955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLenum format, GLenum type, const void *pixels, 42055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz const struct gl_pixelstore_attrib *unpack, 42155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct gl_texture_image *texImage) 42255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz{ 42355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz const GLuint dstImageOffsets[1] = {0}; 42455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct st_texture_image *stImage = st_texture_image(texImage); 42576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 42676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 427b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell struct pipe_screen *screen = pipe->screen; 4281f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format mesa_format; 429287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource templ; 430287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *src_tex; 4318f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct pipe_sampler_view view_templ; 4328f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct pipe_sampler_view *src_view; 4334c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_surface *dst_surface, surf_tmpl; 43455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct pipe_transfer *tex_xfer; 43555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz void *map; 43655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 43755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!stImage->pt) { 43855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* XXX: Can this happen? Should we assert? */ 43955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 44055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 44155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 44255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* get destination surface (in the compressed texture) */ 4434c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger memset(&surf_tmpl, 0, sizeof(surf_tmpl)); 4444c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_tmpl.format = stImage->pt->format; 4454c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_tmpl.usage = PIPE_BIND_RENDER_TARGET; 4464c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_tmpl.u.tex.level = stImage->level; 4474c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_tmpl.u.tex.first_layer = stImage->face; 4484c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_tmpl.u.tex.last_layer = stImage->face; 4494c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger dst_surface = pipe->create_surface(pipe, stImage->pt, &surf_tmpl); 45055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!dst_surface) { 45155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* can't render into this format (or other problem) */ 45255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 45355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 45455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 45555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Choose format for the temporary RGBA texture image. 45655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 45755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz mesa_format = st_ChooseTextureFormat(ctx, GL_RGBA, format, type); 45855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz assert(mesa_format); 45955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!mesa_format) 46055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 46155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 46255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Create the temporary source texture 46355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 46455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz memset(&templ, 0, sizeof(templ)); 4657f15dca6d963b0a69131e8761c477064dba49307Luca Barbieri templ.target = st->internal_target; 4661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul templ.format = st_mesa_format_to_pipe_format(mesa_format); 467683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.width0 = width; 468683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.height0 = height; 469683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.depth0 = 1; 4704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger templ.array_size = 1; 47155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz templ.last_level = 0; 472a2a01853f3f40b4ef8b3f01503391877960bdaeeBrian Paul templ.usage = PIPE_USAGE_DEFAULT; 473287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell templ.bind = PIPE_BIND_SAMPLER_VIEW; 474287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell src_tex = screen->resource_create(screen, &templ); 47555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 47655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!src_tex) 47755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 47855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 47955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Put user's tex data into the temporary texture 48055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 481b0427bedde80e3189524651a327235bdfddbc613José Fonseca tex_xfer = pipe_get_transfer(st_context(ctx)->pipe, src_tex, 4824c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, 0, /* layer, level are zero */ 4834c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_WRITE, 4844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, 0, width, height); /* x, y, w, h */ 485287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell map = pipe_transfer_map(pipe, tex_xfer); 48655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 4876480210b89dc8ae0990c450d27870c7b7930f251Brian Paul _mesa_texstore(ctx, 2, GL_RGBA, mesa_format, 4886480210b89dc8ae0990c450d27870c7b7930f251Brian Paul map, /* dest ptr */ 4896480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, /* dest x/y/z offset */ 4906480210b89dc8ae0990c450d27870c7b7930f251Brian Paul tex_xfer->stride, /* dest row stride (bytes) */ 4916480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstImageOffsets, /* image offsets (for 3D only) */ 4926480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, /* size */ 4936480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, /* source format/type */ 4946480210b89dc8ae0990c450d27870c7b7930f251Brian Paul pixels, /* source data */ 4956480210b89dc8ae0990c450d27870c7b7930f251Brian Paul unpack); /* source data packing */ 49655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 497287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_transfer_unmap(pipe, tex_xfer); 498287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tex_xfer); 49955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 5008f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger /* Create temporary sampler view */ 5018f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger u_sampler_view_default_template(&view_templ, 5028f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_tex, 5038f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_tex->format); 5048f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_view = pipe->create_sampler_view(pipe, src_tex, &view_templ); 5058f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger 5068f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger 50755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* copy / compress image */ 50876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_tex(st->blit, 5098f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_view, /* sampler view (src) */ 51055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 0, 0, /* src x0, y0 */ 51155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz width, height, /* src x1, y1 */ 51255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz dst_surface, /* pipe_surface (dst) */ 51355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset, yoffset, /* dst x0, y0 */ 51455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset + width, /* dst x1 */ 51555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz yoffset + height, /* dst y1 */ 51655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 0.0, /* z */ 51755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz PIPE_TEX_MIPFILTER_NEAREST); 51855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 51955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz pipe_surface_reference(&dst_surface, NULL); 520287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&src_tex, NULL); 5218f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger pipe_sampler_view_reference(&src_view, NULL); 52255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 52355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_TRUE; 52455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz} 52555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 52655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 52755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz/** 5284e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Do glTexImage1/2/3D(). 5294e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul */ 53024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 531f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexImage(struct gl_context * ctx, 532afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint dims, 533afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLenum target, GLint level, 534afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint internalFormat, 535afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint width, GLint height, GLint depth, 536afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint border, 537afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLenum format, GLenum type, const void *pixels, 538afc54983370033b65e3a7cbb29bd9c87156f0881Brian const struct gl_pixelstore_attrib *unpack, 539afc54983370033b65e3a7cbb29bd9c87156f0881Brian struct gl_texture_object *texObj, 540afc54983370033b65e3a7cbb29bd9c87156f0881Brian struct gl_texture_image *texImage, 54155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLsizei imageSize, GLboolean compressed_src) 54224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 54376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 54476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_screen *screen = st->pipe->screen; 54514b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_object *stObj = st_texture_object(texObj); 54614b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_image *stImage = st_texture_image(texImage); 5475a8e1ddf193bb25c5cf05b70088c64ede772d7e9Brian Paul GLuint dstRowStride = 0; 548212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian struct gl_pixelstore_attrib unpackNB; 5495a8e1ddf193bb25c5cf05b70088c64ede772d7e9Brian Paul enum pipe_transfer_usage transfer_usage = 0; 55024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 55124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s target %s level %d %dx%dx%d border %d\n", __FUNCTION__, 55224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_lookup_enum_by_nr(target), level, width, height, depth, border); 55324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 55454a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu /* switch to "normal" */ 55554a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu if (stObj->surface_based) { 55683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul gl_format texFormat; 55783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul 55854a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu _mesa_clear_texture_object(ctx, texObj); 5590f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu pipe_resource_reference(&stObj->pt, NULL); 5600f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu 5610f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu /* oops, need to init this image again */ 56283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul texFormat = _mesa_choose_texture_format(ctx, texObj, target, level, 56383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul internalFormat, format, type); 56483e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul 5650f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu _mesa_init_teximage_fields(ctx, target, texImage, 56683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul width, height, depth, border, 56783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul internalFormat, texFormat); 5680f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu 56954a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu stObj->surface_based = GL_FALSE; 57054a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu } 57154a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu 572212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian /* gallium does not support texture borders, strip it off */ 573212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (border) { 5745facd7986ace899673499f396897469720476799Brian Paul strip_texture_border(border, &width, &height, &depth, unpack, &unpackNB); 575212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpack = &unpackNB; 57621989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Width = width; 57721989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Height = height; 57821989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Depth = depth; 57921989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Border = 0; 580212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian border = 0; 581212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian } 582c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul else { 583c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul assert(texImage->Width == width); 584c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul assert(texImage->Height == height); 585c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul assert(texImage->Depth == depth); 586c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul } 587212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 588cfe9e66f2bc596c43760911e7c1604bb32cdee28Brian stImage->face = _mesa_tex_target_to_face(target); 58914b98343309fdcff3514f05020303f7b40e83a4aBrian stImage->level = level; 59024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 59124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_set_fetch_functions(texImage, dims); 59224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 59324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Release the reference to a potentially orphaned buffer. 59424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Release any old malloced memory. 59524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 596753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 597287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 59824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(!texImage->Data); 59924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 60024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else if (texImage->Data) { 60124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_align_free(texImage->Data); 60224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 60324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 604bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul /* 605bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul * See if the new image is somehow incompatible with the existing 606bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul * mipmap. If so, free the old mipmap. 60724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 608a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul if (stObj->pt) { 609e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if (level > (GLint) stObj->pt->last_level || 610bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul !st_texture_match_image(stObj->pt, &stImage->base, 611bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul stImage->face, stImage->level)) { 612a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul DBG("release it\n"); 613287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 614a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul assert(!stObj->pt); 61540c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 616a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul } 61724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 61824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 619bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul if (width == 0 || height == 0 || depth == 0) { 620bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul /* stop after freeing old image */ 621bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul return; 622bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul } 623bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul 624753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stObj->pt) { 6252b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul if (!guess_and_alloc_texture(st, stObj, stImage)) { 6268d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul /* Probably out of memory. 6278d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul * Try flushing any pending rendering, then retry. 6288d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul */ 62976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_finish(st); 6302b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul if (!guess_and_alloc_texture(st, stObj, stImage)) { 6318d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 6328d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul return; 6338d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul } 63424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 63524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 63624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 637753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(!stImage->pt); 63824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 639013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* Check if this texture image can live inside the texture object's buffer. 640013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * If so, store the image there. Otherwise the image will temporarily live 641013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * in its own buffer. 642013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul */ 643753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stObj->pt && 644753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer st_texture_match_image(stObj->pt, &stImage->base, 645013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul stImage->face, stImage->level)) { 64624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 647287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, stObj->pt); 648753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(stImage->pt); 64924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 65024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 651753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stImage->pt) 652753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer DBG("XXX: Image did not fit into texture - storing in local memory!\n"); 65324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 654013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* Pixel data may come from regular user memory or a PBO. For the later, 655013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * do bounds checking and map the PBO to read pixels data from it. 656013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * 657013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * XXX we should try to use a GPU-accelerated path to copy the image data 658013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * from the PBO to the texture. 65924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 66055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compressed_src) { 66124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, pixels, 66224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian unpack, 66324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "glCompressedTexImage"); 6645facd7986ace899673499f396897469720476799Brian Paul } 6655facd7986ace899673499f396897469720476799Brian Paul else { 66624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, 1, 66724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type, 66824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels, unpack, "glTexImage"); 66924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 670cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 67155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* See if we can do texture compression with a blit/render. 67255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 67355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!compressed_src && 67455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz !ctx->Mesa_DXTn && 67592863109af05acdb4ee5e42141c83ab0f18b7f88Brian Paul _mesa_is_format_compressed(texImage->TexFormat) && 67655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz screen->is_format_supported(screen, 67755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->pt->format, 678127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger stImage->pt->target, 0, 679287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 0)) { 680cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul if (!pixels) 681cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul goto done; 682cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 68355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compress_with_blit(ctx, target, level, 0, 0, 0, width, height, depth, 68455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz format, type, pixels, unpack, texImage)) { 685f989390af6f827d1ea36560381340148811836f3Jakob Bornecrantz goto done; 68655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 68755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 68855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 689013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* 690013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * Prepare to store the texture data. Either map the gallium texture buffer 691013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * memory or malloc space for it. 692013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul */ 693753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 69441b8a2e9391cd85a65ba30a7e5f5068b5767d58aBrian Paul /* Store the image in the gallium texture memory buffer */ 69571633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer if (format == GL_DEPTH_COMPONENT && 6960bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 69771633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 69871633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 69971633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 70071633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 70176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 702c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul transfer_usage, 0, 0, width, height); 70301397a66c77f8ebfe78b90ace59c095194a290cfJosé Fonseca if(stImage->transfer) 70401397a66c77f8ebfe78b90ace59c095194a290cfJosé Fonseca dstRowStride = stImage->transfer->stride; 70524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 70624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 70724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Allocate regular memory and store the image there temporarily. */ 708c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul GLuint imageSize = _mesa_format_image_size(texImage->TexFormat, 709c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul width, height, depth); 710c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul dstRowStride = _mesa_format_row_stride(texImage->TexFormat, width); 71124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 712c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul texImage->Data = _mesa_align_malloc(imageSize, 16); 71324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 71424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 7152a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul if (!texImage->Data) { 7162a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 7172a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul return; 7182a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul } 7192a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul 720013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul if (!pixels) { 721013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* We've allocated texture memory, but have no pixel data - all done. */ 722cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul goto done; 723013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul } 724cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 72524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("Upload image %dx%dx%d row_len %x pitch %x\n", 72641b8a2e9391cd85a65ba30a7e5f5068b5767d58aBrian Paul width, height, depth, width, dstRowStride); 72724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 728013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* Copy user texture image into the texture buffer. 72924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 73055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compressed_src) { 731e79086865bd67f860dfd0d5951395495530022bcBrian Paul const GLuint srcRowStride = 732e79086865bd67f860dfd0d5951395495530022bcBrian Paul _mesa_format_row_stride(texImage->TexFormat, width); 733e79086865bd67f860dfd0d5951395495530022bcBrian Paul if (dstRowStride == srcRowStride) { 734eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri memcpy(texImage->Data, pixels, imageSize); 735e79086865bd67f860dfd0d5951395495530022bcBrian Paul } 736e79086865bd67f860dfd0d5951395495530022bcBrian Paul else { 737eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri char *dst = texImage->Data; 738eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri const char *src = pixels; 7399328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri GLuint i, bw, bh, lines; 7409328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri _mesa_get_format_block_size(texImage->TexFormat, &bw, &bh); 7419328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri lines = (height + bh - 1) / bh; 742eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri 743e79086865bd67f860dfd0d5951395495530022bcBrian Paul for (i = 0; i < lines; ++i) { 744e79086865bd67f860dfd0d5951395495530022bcBrian Paul memcpy(dst, src, srcRowStride); 745eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri dst += dstRowStride; 746e79086865bd67f860dfd0d5951395495530022bcBrian Paul src += srcRowStride; 747eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri } 748eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri } 74924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 750753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer else { 751eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint srcImageStride = 752eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(unpack, width, height, format, type); 7535facd7986ace899673499f396897469720476799Brian Paul GLint i; 7545823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian const GLubyte *src = (const GLubyte *) pixels; 755753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 756d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 7576480210b89dc8ae0990c450d27870c7b7930f251Brian Paul if (!_mesa_texstore(ctx, dims, 7586480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->_BaseFormat, 7596480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 7606480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->Data, 7616480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 7626480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 7636480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 7646480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 7656480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, src, unpack)) { 766753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 767753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 768753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 769d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 770d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 77176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 772d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 77376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, i + 1, 77471633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 0, 0, 775c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul width, height); 7765823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src += srcImageStride; 777753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 778753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 77924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 78024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 78108d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Pauldone: 78224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_unmap_teximage_pbo(ctx, unpack); 78324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 78455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (stImage->pt && texImage->Data) { 78576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 78624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 78724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 78824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 78924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 79024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 79124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 792f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexImage3D(struct gl_context * ctx, 7934e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 7944e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 7954e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint depth, 7964e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint border, 7974e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 7984e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 7994e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 8004e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 80124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8025facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 3, target, level, internalFormat, width, height, depth, 8035facd7986ace899673499f396897469720476799Brian Paul border, format, type, pixels, unpack, texObj, texImage, 8045facd7986ace899673499f396897469720476799Brian Paul 0, GL_FALSE); 80524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 80624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 80724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 80824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 809f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexImage2D(struct gl_context * ctx, 8104e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 8114e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 8124e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint border, 8134e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 8144e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 8154e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 8164e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 81724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8185facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 2, target, level, internalFormat, width, height, 1, border, 8195facd7986ace899673499f396897469720476799Brian Paul format, type, pixels, unpack, texObj, texImage, 0, GL_FALSE); 82024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 82124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 82224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 82324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 824f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexImage1D(struct gl_context * ctx, 8254e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 8264e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 8274e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint border, 8284e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 8294e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 8304e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 8314e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 83224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8335facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 1, target, level, internalFormat, width, 1, 1, border, 8345facd7986ace899673499f396897469720476799Brian Paul format, type, pixels, unpack, texObj, texImage, 0, GL_FALSE); 83524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 83624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 83724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 83824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 839f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CompressedTexImage2D(struct gl_context *ctx, GLenum target, GLint level, 8404e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 8414e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint border, 8424e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLsizei imageSize, const GLvoid *data, 8434e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 8444e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 84524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8465facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 2, target, level, internalFormat, width, height, 1, border, 8475facd7986ace899673499f396897469720476799Brian Paul 0, 0, data, &ctx->Unpack, texObj, texImage, imageSize, GL_TRUE); 84824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 84924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 85024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 85151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 85251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul/** 85351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * glGetTexImage() helper: decompress a compressed texture by rendering 85451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * a textured quad. Store the results in the user's buffer. 85551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul */ 85651b339af2e8b80575a24bb9146f031c9605180bbBrian Paulstatic void 857f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdecompress_with_blit(struct gl_context * ctx, GLenum target, GLint level, 85851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul GLenum format, GLenum type, GLvoid *pixels, 85951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_object *texObj, 86051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_image *texImage) 86151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul{ 86276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 86376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 86451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct st_texture_image *stImage = st_texture_image(texImage); 8658f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct st_texture_object *stObj = st_texture_object(texObj); 8665d3d63d45a037fdf603ddcff88da635c3ce8075eBrian Paul struct pipe_sampler_view *src_view = 8675d3d63d45a037fdf603ddcff88da635c3ce8075eBrian Paul st_get_texture_sampler_view(stObj, pipe); 86851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul const GLuint width = texImage->Width; 86951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul const GLuint height = texImage->Height; 87051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct pipe_surface *dst_surface; 871287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *dst_texture; 87251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct pipe_transfer *tex_xfer; 873127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger unsigned bind = (PIPE_BIND_RENDER_TARGET | /* util_blit may choose to render */ 874287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_TRANSFER_READ); 87551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 87651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* create temp / dest surface */ 8774c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger if (!util_create_rgba_surface(pipe, width, height, bind, 87851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul &dst_texture, &dst_surface)) { 87951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul _mesa_problem(ctx, "util_create_rgba_surface() failed " 88051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul "in decompress_with_blit()"); 88151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul return; 88251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 88351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 88451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* blit/render/decompress */ 88576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_tex(st->blit, 886287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell src_view, /* pipe_resource (src) */ 88751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0, 0, /* src x0, y0 */ 88851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul width, height, /* src x1, y1 */ 88951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul dst_surface, /* pipe_surface (dst) */ 89051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0, 0, /* dst x0, y0 */ 89151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul width, height, /* dst x1, y1 */ 89251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0.0, /* z */ 89351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul PIPE_TEX_MIPFILTER_NEAREST); 89451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 89551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* map the dst_surface so we can read from it */ 896b0427bedde80e3189524651a327235bdfddbc613José Fonseca tex_xfer = pipe_get_transfer(st_context(ctx)->pipe, 8974c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger dst_texture, 0, 0, 8984c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_READ, 8994c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, 0, width, height); 90051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 9011b448c7a5cafa68eeead2a4c45f4362a9883383bBrian Paul pixels = _mesa_map_pbo_dest(ctx, &ctx->Pack, pixels); 90251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 9037b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* copy/pack data into user buffer */ 9047b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul if (st_equal_formats(stImage->pt->format, format, type)) { 9057b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* memcpy */ 906b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const uint bytesPerRow = width * util_format_get_blocksize(stImage->pt->format); 907287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell ubyte *map = pipe_transfer_map(pipe, tex_xfer); 9087b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLuint row; 9097b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul for (row = 0; row < height; row++) { 9107b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLvoid *dest = _mesa_image_address2d(&ctx->Pack, pixels, width, 9117b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul height, format, type, row, 0); 9127b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul memcpy(dest, map, bytesPerRow); 9137b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul map += tex_xfer->stride; 9147b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 915287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_transfer_unmap(pipe, tex_xfer); 91651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 9177b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul else { 9187b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* format translation via floats */ 9197b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLuint row; 9209d380f487a4f2628594821a4fed5fe587ce52031Brian Paul enum pipe_format format = util_format_linear(dst_texture->format); 9217b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul for (row = 0; row < height; row++) { 9227b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul const GLbitfield transferOps = 0x0; /* bypassed for glGetTexImage() */ 9237b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLfloat rgba[4 * MAX_WIDTH]; 9247b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLvoid *dest = _mesa_image_address2d(&ctx->Pack, pixels, width, 9257b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul height, format, type, row, 0); 9267b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 927b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 928b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s: fallback format translation\n", __FUNCTION__); 929b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 9307b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* get float[4] rgba row from surface */ 9319d380f487a4f2628594821a4fed5fe587ce52031Brian Paul pipe_get_tile_rgba_format(pipe, tex_xfer, 0, row, width, 1, 9329d380f487a4f2628594821a4fed5fe587ce52031Brian Paul format, rgba); 9337b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 9347b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul _mesa_pack_rgba_span_float(ctx, width, (GLfloat (*)[4]) rgba, format, 9357b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul type, dest, &ctx->Pack, transferOps); 9367b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 9377b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 9387b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 9391b448c7a5cafa68eeead2a4c45f4362a9883383bBrian Paul _mesa_unmap_pbo_dest(ctx, &ctx->Pack); 94051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 941287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tex_xfer); 94263af29bfbe265318bcf5be69e420de361b900321Keith Whitwell 94351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* destroy the temp / dest surface */ 94451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul util_destroy_rgba_surface(dst_texture, dst_surface); 94551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul} 94651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 94751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 94851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 94924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 95024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Need to map texture image into memory before copying image data, 95124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * then unmap it. 95224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 95324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 954f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_get_tex_image(struct gl_context * ctx, GLenum target, GLint level, 95524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, GLvoid * pixels, 95624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 95751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_image *texImage, GLboolean compressed_dst) 95824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 95976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 96024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 961eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint dstImageStride = 962eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(&ctx->Pack, texImage->Width, texImage->Height, 963eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul format, type); 9645facd7986ace899673499f396897469720476799Brian Paul GLuint depth, i; 9655823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian GLubyte *dest; 96624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 96751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul if (stImage->pt && 968cfbbe244d7438a60d389ae9d996dd430f79f362fJosé Fonseca util_format_is_s3tc(stImage->pt->format) && 96951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul !compressed_dst) { 97051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* Need to decompress the texture. 97151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * We'll do this by rendering a textured quad. 97251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * Note that we only expect RGBA formats (no Z/depth formats). 97351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul */ 97451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul decompress_with_blit(ctx, target, level, format, type, pixels, 97551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul texObj, texImage); 97651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul return; 97751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 97851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 97924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Map */ 980753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 98124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Image is stored in hardware format in a buffer managed by the 98224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * kernel. Need to explicitly map and unmap it. 98324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 98476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 9854617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer PIPE_TRANSFER_READ, 0, 0, 9864617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Width, 9874617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Height); 9887b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul /* compute stride in texels from stride in bytes */ 9897b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul texImage->RowStride = stImage->transfer->stride 9907b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul * util_format_get_blockwidth(stImage->pt->format) 9917b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul / util_format_get_blocksize(stImage->pt->format); 99224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 99324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 99424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Otherwise, the image should actually be stored in 995753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer * texImage->Data. This is pretty confusing for 99624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * everybody, I'd much prefer to separate the two functions of 99724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * texImage->Data - storage for texture images in main memory 99824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * and access (ie mappings) of images. In other words, we'd 99924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * create a new texImage->Map field and leave Data simply for 100024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * storage. 100124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1002753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(texImage->Data); 100324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 100424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1005753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer depth = texImage->Depth; 1006753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Depth = 1; 100724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 10085823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian dest = (GLubyte *) pixels; 10095823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian 1010603bef557220d68dbb165e775c7c9b0d6db7709eLuca Barbieri _mesa_set_fetch_functions(texImage, get_texture_dims(target)); 1011603bef557220d68dbb165e775c7c9b0d6db7709eLuca Barbieri 1012d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 101351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul if (compressed_dst) { 10145823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian _mesa_get_compressed_teximage(ctx, target, level, dest, 1015753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texObj, texImage); 10165facd7986ace899673499f396897469720476799Brian Paul } 10175facd7986ace899673499f396897469720476799Brian Paul else { 10185823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian _mesa_get_teximage(ctx, target, level, format, type, dest, 1019753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texObj, texImage); 1020753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1021753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1022d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 1023d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 102476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1025d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 102676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, i + 1, 10274617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer PIPE_TRANSFER_READ, 0, 0, 10284617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Width, 10294617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Height); 10305823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian dest += dstImageStride; 1031753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 103224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 1033753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1034753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Depth = depth; 103524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 103624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Unmap */ 1037753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 103876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1039753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Data = NULL; 104024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 104124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 104224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 104324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 104424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1045f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_GetTexImage(struct gl_context * ctx, GLenum target, GLint level, 10464e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, GLvoid * pixels, 10474e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 10484e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 104924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 10505facd7986ace899673499f396897469720476799Brian Paul st_get_tex_image(ctx, target, level, format, type, pixels, texObj, texImage, 10515facd7986ace899673499f396897469720476799Brian Paul GL_FALSE); 105224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 105324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 105424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 105524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1056f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_GetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level, 10574e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLvoid *pixels, 105847bf26845712bea756526fc159bdb355ceaef9c2Brian Paul struct gl_texture_object *texObj, 105947bf26845712bea756526fc159bdb355ceaef9c2Brian Paul struct gl_texture_image *texImage) 106024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 10615facd7986ace899673499f396897469720476799Brian Paul st_get_tex_image(ctx, target, level, 0, 0, pixels, texObj, texImage, 10625facd7986ace899673499f396897469720476799Brian Paul GL_TRUE); 106324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 106424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 106524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 106624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 106724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1068f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexSubimage(struct gl_context *ctx, GLint dims, GLenum target, GLint level, 10694e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 10704e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint depth, 10714e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 10724e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *packing, 10734e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 10744e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 107524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 107676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 107776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_screen *screen = st->pipe->screen; 107824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 107924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint dstRowStride; 1080eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint srcImageStride = 1081eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(packing, width, height, format, type); 10825facd7986ace899673499f396897469720476799Brian Paul GLint i; 10835823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian const GLubyte *src; 1084a7427b0f7b2325b8dcc560d57cb894df25ebef93Brian Paul /* init to silence warning only: */ 1085a7427b0f7b2325b8dcc560d57cb894df25ebef93Brian Paul enum pipe_transfer_usage transfer_usage = PIPE_TRANSFER_WRITE; 108624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 108724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s target %s level %d offset %d,%d %dx%d\n", __FUNCTION__, 108824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_lookup_enum_by_nr(target), 108924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian level, xoffset, yoffset, width, height); 109024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 109124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = 109224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, format, 109324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian type, pixels, packing, "glTexSubImage2D"); 109424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!pixels) 109524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return; 109624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 109755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* See if we can do texture compression with a blit/render. 109855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 109955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!ctx->Mesa_DXTn && 110092863109af05acdb4ee5e42141c83ab0f18b7f88Brian Paul _mesa_is_format_compressed(texImage->TexFormat) && 110155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz screen->is_format_supported(screen, 110255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->pt->format, 1103127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger stImage->pt->target, 0, 1104287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 0)) { 110555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compress_with_blit(ctx, target, level, 110655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset, yoffset, zoffset, 110755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz width, height, depth, 110855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz format, type, pixels, packing, texImage)) { 1109f989390af6f827d1ea36560381340148811836f3Jakob Bornecrantz goto done; 111055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 111155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 111255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 111324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Map buffer if necessary. Need to lock to prevent other contexts 111424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * from uploading the buffer under us. 111524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1116753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 111771633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer if (format == GL_DEPTH_COMPONENT && 11180bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 111971633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 112071633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 112171633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 112271633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 112376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, zoffset, 112471633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 11254617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer xoffset, yoffset, 11269e84e7def152aa8080da59a78795d6434e687403Jakob Bornecrantz width, height); 1127753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1128753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 11299b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul if (!texImage->Data) { 11309b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 113108d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Paul goto done; 11329b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul } 11339b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul 11345823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src = (const GLubyte *) pixels; 1135d7b7b63bd7cca80e99ad9701f8b56ee365053647Michal Krol dstRowStride = stImage->transfer->stride; 11365823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian 1137d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 11386480210b89dc8ae0990c450d27870c7b7930f251Brian Paul if (!_mesa_texstore(ctx, dims, texImage->_BaseFormat, 11396480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 11406480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->Data, 11416480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, 11426480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 11436480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 11446480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 11456480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, src, packing)) { 11469b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 1147753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1148753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1149d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 1150d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 115176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1152d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 115376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 1154d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul zoffset + i + 1, 115571633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 11564617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer xoffset, yoffset, 11579e84e7def152aa8080da59a78795d6434e687403Jakob Bornecrantz width, height); 11585823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src += srcImageStride; 1159753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 116024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 116124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 116208d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Pauldone: 116324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_unmap_teximage_pbo(ctx, packing); 116424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11651e414df894fc70b7024eb38c812e582336014974Michel Dänzer if (stImage->pt && texImage->Data) { 116676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 116724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 116824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 116924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 117024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 117124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 117224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 117324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1174f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexSubImage3D(struct gl_context *ctx, GLenum target, GLint level, 11755facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 11765facd7986ace899673499f396897469720476799Brian Paul GLsizei width, GLsizei height, GLsizei depth, 11775facd7986ace899673499f396897469720476799Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 11785facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 11795facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 11805facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 118124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 11825facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 3, target, level, xoffset, yoffset, zoffset, 11835facd7986ace899673499f396897469720476799Brian Paul width, height, depth, format, type, 11845facd7986ace899673499f396897469720476799Brian Paul pixels, packing, texObj, texImage); 118524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 118624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 118724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 118824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1189f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexSubImage2D(struct gl_context *ctx, GLenum target, GLint level, 11905facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLint yoffset, 11915facd7986ace899673499f396897469720476799Brian Paul GLsizei width, GLsizei height, 11925facd7986ace899673499f396897469720476799Brian Paul GLenum format, GLenum type, const GLvoid * pixels, 11935facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 11945facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 11955facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 119624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 11975facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 2, target, level, xoffset, yoffset, 0, 11985facd7986ace899673499f396897469720476799Brian Paul width, height, 1, format, type, 11995facd7986ace899673499f396897469720476799Brian Paul pixels, packing, texObj, texImage); 120024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 120124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 120224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 120324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1204f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexSubImage1D(struct gl_context *ctx, GLenum target, GLint level, 12055facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLsizei width, GLenum format, GLenum type, 12065facd7986ace899673499f396897469720476799Brian Paul const GLvoid * pixels, 12075facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 12085facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 12095facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 121024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 12115facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 1, target, level, xoffset, 0, 0, width, 1, 1, 1212b245840b86cf877c9b8d666edf229364a84f1deaBrian format, type, pixels, packing, texObj, texImage); 121324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 121424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 121524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1216a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantzstatic void 1217f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CompressedTexSubImage1D(struct gl_context *ctx, GLenum target, GLint level, 1218578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLint xoffset, GLsizei width, 1219578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLenum format, 1220578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1221578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_object *texObj, 1222578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_image *texImage) 1223578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz{ 1224578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz assert(0); 1225578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz} 1226578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1227578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1228578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzstatic void 1229f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CompressedTexSubImage2D(struct gl_context *ctx, GLenum target, GLint level, 1230a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLint xoffset, GLint yoffset, 1231a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLsizei width, GLint height, 1232a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLenum format, 1233a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1234a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct gl_texture_object *texObj, 1235a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct gl_texture_image *texImage) 1236a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz{ 123776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 1238a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct st_texture_image *stImage = st_texture_image(texImage); 1239a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int srcBlockStride; 1240a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int dstBlockStride; 1241a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int y; 12427b8c4f22d4fd78829dd5843db92321ec0665932eVinson Lee enum pipe_format pformat; 1243a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1244a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (stImage->pt) { 12457b8c4f22d4fd78829dd5843db92321ec0665932eVinson Lee pformat = stImage->pt->format; 12464ed1de8b84b587d2be0c0e4ecb6b5f421195f562José Fonseca 124776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 1248a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz PIPE_TRANSFER_WRITE, 1249a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz xoffset, yoffset, 1250a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz width, height); 1251a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1252b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol srcBlockStride = util_format_get_stride(pformat, width); 1253a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz dstBlockStride = stImage->transfer->stride; 1254a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } else { 1255a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz assert(stImage->pt); 1256a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* TODO find good values for block and strides */ 1257a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* TODO also adjust texImage->data for yoffset/xoffset */ 1258a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz return; 1259a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1260a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1261a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (!texImage->Data) { 1262a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage"); 1263a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz return; 1264a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1265a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1266b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(xoffset % util_format_get_blockwidth(pformat) == 0); 1267b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(yoffset % util_format_get_blockheight(pformat) == 0); 1268a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1269b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol for (y = 0; y < height; y += util_format_get_blockheight(pformat)) { 1270a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* don't need to adjust for xoffset and yoffset as st_texture_image_map does that */ 1271b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const char *src = (const char*)data + srcBlockStride * util_format_get_nblocksy(pformat, y); 1272b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol char *dst = (char*)texImage->Data + dstBlockStride * util_format_get_nblocksy(pformat, y); 1273b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol memcpy(dst, src, util_format_get_stride(pformat, width)); 1274a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1275a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1276a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (stImage->pt) { 127776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1278a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz texImage->Data = NULL; 1279a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1280a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz} 1281a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1282a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1283578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzstatic void 1284f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CompressedTexSubImage3D(struct gl_context *ctx, GLenum target, GLint level, 1285578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLint xoffset, GLint yoffset, GLint zoffset, 1286578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei width, GLint height, GLint depth, 1287578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLenum format, 1288578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1289578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_object *texObj, 1290578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_image *texImage) 1291578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz{ 1292578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz assert(0); 1293578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz} 1294578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1295578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 129624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 129724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 12985facd7986ace899673499f396897469720476799Brian Paul * Do a CopyTexSubImage operation using a read transfer from the source, 12995facd7986ace899673499f396897469720476799Brian Paul * a write transfer to the destination and get_tile()/put_tile() to access 13005facd7986ace899673499f396897469720476799Brian Paul * the pixels/texels. 1301c6717a86420d7141013165f7acd50b3c3f751756Brian * 1302c6717a86420d7141013165f7acd50b3c3f751756Brian * Note: srcY=0=TOP of renderbuffer 1303038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian */ 1304038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 1305f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergfallback_copy_texsubimage(struct gl_context *ctx, GLenum target, GLint level, 1306038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_renderbuffer *strb, 1307038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_texture_image *stImage, 1308038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLenum baseFormat, 1309038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint destX, GLint destY, GLint destZ, 1310038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint srcX, GLint srcY, 1311038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLsizei width, GLsizei height) 1312038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian{ 131376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 131476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 13154617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer struct pipe_transfer *src_trans; 13164617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer GLvoid *texDest; 131771633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer enum pipe_transfer_usage transfer_usage; 13184c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 1319b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 1320b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s: fallback processing\n", __FUNCTION__); 13214617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer 13224617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer assert(width <= MAX_WIDTH); 1323038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 13244617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 13257c8836e9ef49d938aa55a1c385b95c6371c301f1Michel Dänzer srcY = strb->Base.Height - srcY - height; 13264617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer } 1327f3048ad90ed2e4583f0f7aaf35a0f4aa581942ddBrian Paul 1328b0427bedde80e3189524651a327235bdfddbc613José Fonseca src_trans = pipe_get_transfer(st_context(ctx)->pipe, 13294c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger strb->texture, 13304c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, 0, 13314c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_READ, 13324c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcX, srcY, 13334c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger width, height); 1334038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 13350197348641614188c400d7c616573bb7f1eea781Brian Paul if ((baseFormat == GL_DEPTH_COMPONENT || 13360197348641614188c400d7c616573bb7f1eea781Brian Paul baseFormat == GL_DEPTH_STENCIL) && 13370bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 133871633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 133971633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 134071633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 134171633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 13424c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger /* XXX this used to ignore destZ param */ 13434c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger texDest = st_texture_image_map(st, stImage, destZ, transfer_usage, 13444617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer destX, destY, width, height); 1345038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 1346105758105a790dd8466c6be8c232c3f215ca4deeBrian Paul if (baseFormat == GL_DEPTH_COMPONENT || 13470197348641614188c400d7c616573bb7f1eea781Brian Paul baseFormat == GL_DEPTH_STENCIL) { 1348cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul const GLboolean scaleOrBias = (ctx->Pixel.DepthScale != 1.0F || 1349cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul ctx->Pixel.DepthBias != 0.0F); 135027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLint row, yStep; 1351cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul 135227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* determine bottom-to-top vs. top-to-bottom order for src buffer */ 135327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 13547c8836e9ef49d938aa55a1c385b95c6371c301f1Michel Dänzer srcY = height - 1; 135527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul yStep = -1; 135627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 135727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul else { 13584617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer srcY = 0; 135927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul yStep = 1; 136027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 136127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 136227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* To avoid a large temp memory allocation, do copy row by row */ 13634617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer for (row = 0; row < height; row++, srcY += yStep) { 1364cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul uint data[MAX_WIDTH]; 1365d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_get_tile_z(pipe, src_trans, 0, srcY, width, 1, data); 1366cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul if (scaleOrBias) { 1367cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul _mesa_scale_and_bias_depth_uint(ctx, width, data); 1368cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1369d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_put_tile_z(pipe, stImage->transfer, 0, row, width, 1, data); 1370cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1371cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1372cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul else { 1373cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul /* RGBA format */ 137427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLfloat *tempSrc = 137532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat)); 137627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 137727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (tempSrc && texDest) { 137827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul const GLint dims = 2; 13795facd7986ace899673499f396897469720476799Brian Paul const GLint dstRowStride = stImage->transfer->stride; 138027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul struct gl_texture_image *texImage = &stImage->base; 138127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul struct gl_pixelstore_attrib unpack = ctx->DefaultPacking; 138227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 138327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 138427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul unpack.Invert = GL_TRUE; 1385cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 138627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 138727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* get float/RGBA image from framebuffer */ 138827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* XXX this usually involves a lot of int/float conversion. 138927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * try to avoid that someday. 139027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 13919d380f487a4f2628594821a4fed5fe587ce52031Brian Paul pipe_get_tile_rgba_format(pipe, src_trans, 0, 0, width, height, 13929d380f487a4f2628594821a4fed5fe587ce52031Brian Paul util_format_linear(strb->texture->format), 13939d380f487a4f2628594821a4fed5fe587ce52031Brian Paul tempSrc); 139427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 139527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* Store into texture memory. 139627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * Note that this does some special things such as pixel transfer 139727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * ops and format conversion. In particular, if the dest tex format 139827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * is actually RGBA but the user created the texture as GL_RGB we 139927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * need to fill-in/override the alpha channel with 1.0. 140027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 14016480210b89dc8ae0990c450d27870c7b7930f251Brian Paul _mesa_texstore(ctx, dims, 14026480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->_BaseFormat, 14036480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 14046480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texDest, 14056480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, 14066480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 14076480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 14086480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 14096480210b89dc8ae0990c450d27870c7b7930f251Brian Paul GL_RGBA, GL_FLOAT, tempSrc, /* src */ 14106480210b89dc8ae0990c450d27870c7b7930f251Brian Paul &unpack); 141127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 141227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul else { 141327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 14145c83f1371978472fbe4bba8f686733c6b519874aBrian } 141527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 141627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (tempSrc) 141732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempSrc); 14185c83f1371978472fbe4bba8f686733c6b519874aBrian } 1419d0279fc4b38c72356a341173317bcd45d9093f45Michel Dänzer 142076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1421287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, src_trans); 1422038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian} 1423038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 1424038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 142565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul 142665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul/** 142765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * If the format of the src renderbuffer and the format of the dest 142865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * texture are compatible (in terms of blitting), return a TGSI writemask 142965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * to be used during the blit. 143065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * If the src/dest are incompatible, return 0. 143165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 14328fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwellstatic unsigned 1433f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcompatible_src_dst_formats(struct gl_context *ctx, 143465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const struct gl_renderbuffer *src, 14358fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell const struct gl_texture_image *dst) 14368fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell{ 143765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Get logical base formats for the src and dest. 143865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * That is, use the user-requested formats and not the actual, device- 143965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * chosen formats. 144065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * For example, the user may have requested an A8 texture but the 144165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * driver may actually be using an RGBA texture format. When we 144265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * copy/blit to that texture, we only want to copy the Alpha channel 144365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * and not the RGB channels. 144465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * 144565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * Similarly, when the src FBO was created an RGB format may have been 144665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * requested but the driver actually chose an RGBA format. In that case, 144765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * we don't want to copy the undefined Alpha channel to the dest texture 144865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * (it should be 1.0). 144965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 145065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const GLenum srcFormat = _mesa_base_fbo_format(ctx, src->InternalFormat); 145165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const GLenum dstFormat = _mesa_base_tex_format(ctx, dst->InternalFormat); 14528fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 145365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /** 145465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * XXX when we have red-only and red/green renderbuffers we'll need 145565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * to add more cases here (or implement a general-purpose routine that 145665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * queries the existance of the R,G,B,A channels in the src and dest). 145765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 145865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul if (srcFormat == dstFormat) { 14598fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell /* This is the same as matching_base_formats, which should 14608fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell * always pass, as it did previously. 14618fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 14628fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell return TGSI_WRITEMASK_XYZW; 14638fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 146465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul else if (srcFormat == GL_RGB && dstFormat == GL_RGBA) { 146565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Make sure that A in the dest is 1. The actual src format 146665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * may be RGBA and have undefined A values. 146765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 146865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul return TGSI_WRITEMASK_XYZ; 146965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul } 147065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul else if (srcFormat == GL_RGBA && dstFormat == GL_RGB) { 147165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Make sure that A in the dest is 1. The actual dst format 147265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * may be RGBA and will need A=1 to provide proper alpha values 147365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * when sampled later. 14748fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 147565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul return TGSI_WRITEMASK_XYZ; 14768fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 14778fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell else { 1478b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 1479b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s failed for src %s, dst %s\n", 1480b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell __FUNCTION__, 1481b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell _mesa_lookup_enum_by_nr(srcFormat), 148265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul _mesa_lookup_enum_by_nr(dstFormat)); 1483b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 14848fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell /* Otherwise fail. 14858fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 14868fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell return 0; 14878fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 14888fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell} 14898fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 14908fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 14918fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 1492038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian/** 14934e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Do a CopyTex[Sub]Image1/2/3D() using a hardware (blit) path if possible. 14944e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Note that the region to copy has already been clipped so we know we 14954e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * won't read from outside the source renderbuffer's bounds. 1496c6717a86420d7141013165f7acd50b3c3f751756Brian * 14974e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Note: srcY=0=Bottom of renderbuffer (GL convention) 149824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1499038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 1500f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_copy_texsubimage(struct gl_context *ctx, 1501038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLenum target, GLint level, 1502038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint destX, GLint destY, GLint destZ, 1503038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint srcX, GLint srcY, 1504038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLsizei width, GLsizei height) 150524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1506038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_unit *texUnit = 1507038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 1508038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_object *texObj = 1509038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian _mesa_select_tex_object(ctx, texUnit, target); 1510038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_image *texImage = 1511038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian _mesa_select_tex_image(ctx, texObj, target, level); 1512038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_texture_image *stImage = st_texture_image(texImage); 15130197348641614188c400d7c616573bb7f1eea781Brian Paul const GLenum texBaseFormat = texImage->_BaseFormat; 1514b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian struct gl_framebuffer *fb = ctx->ReadBuffer; 1515b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian struct st_renderbuffer *strb; 151676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 151776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 15186f715dcc219071e574e363a9db4365c9c31ebbd3Brian struct pipe_screen *screen = pipe->screen; 151927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul enum pipe_format dest_format, src_format; 1520cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul GLboolean use_fallback = GL_TRUE; 152127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLboolean matching_base_formats; 1522127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger GLuint format_writemask, sample_count; 15238fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell struct pipe_surface *dest_surface = NULL; 15248fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell GLboolean do_flip = (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP); 152524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1526afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell /* make sure finalize_textures has been called? 1527afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell */ 152876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul if (0) st_validate_state(st); 1529afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell 1530b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian /* determine if copying depth or color data */ 1531105758105a790dd8466c6be8c232c3f215ca4deeBrian Paul if (texBaseFormat == GL_DEPTH_COMPONENT || 15320197348641614188c400d7c616573bb7f1eea781Brian Paul texBaseFormat == GL_DEPTH_STENCIL) { 1533b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian strb = st_renderbuffer(fb->_DepthBuffer); 153459051ad44310d7f744fcb0706326564990b554ddHenri Verbeet if (strb->Base.Wrapped) { 153559051ad44310d7f744fcb0706326564990b554ddHenri Verbeet strb = st_renderbuffer(strb->Base.Wrapped); 153659051ad44310d7f744fcb0706326564990b554ddHenri Verbeet } 153724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 1538b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian else { 15394e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* texBaseFormat == GL_RGB, GL_RGBA, GL_ALPHA, etc */ 1540b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian strb = st_renderbuffer(fb->_ColorReadBuffer); 1541b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian } 1542b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 1543afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell if (!strb || !strb->surface || !stImage->pt) { 1544afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell debug_printf("%s: null strb or stImage\n", __FUNCTION__); 1545afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell return; 1546afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell } 1547afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell 1548127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger sample_count = strb->surface->texture->nr_samples; 1549127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* I believe this would be legal, presumably would need to do a resolve 1550127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger for color, and for depth/stencil spec says to just use one of the 1551127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger depth/stencil samples per pixel? Need some transfer clarifications. */ 1552127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger assert(sample_count < 2); 1553127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger 1554e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (srcX < 0) { 1555e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell width -= -srcX; 1556e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destX += -srcX; 1557e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcX = 0; 1558e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1559e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1560e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (srcY < 0) { 1561e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell height -= -srcY; 1562e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destY += -srcY; 1563e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcY = 0; 1564e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1565e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1566e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (destX < 0) { 1567e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell width -= -destX; 1568e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcX += -destX; 1569e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destX = 0; 1570e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1571e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1572e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (destY < 0) { 1573e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell height -= -destY; 1574e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcY += -destY; 1575e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destY = 0; 1576e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1577e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1578e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (width < 0 || height < 0) 1579e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell return; 1580e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1581e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1582b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian assert(strb); 1583b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian assert(strb->surface); 1584753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(stImage->pt); 1585c6717a86420d7141013165f7acd50b3c3f751756Brian 1586b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian src_format = strb->surface->format; 1587753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer dest_format = stImage->pt->format; 1588b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 158927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* 159027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * Determine if the src framebuffer and dest texture have the same 159127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * base format. We need this to detect a case such as the framebuffer 159227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * being GL_RGBA but the texture being GL_RGB. If the actual hardware 159327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * texture format stores RGBA we need to set A=1 (overriding the 159427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * framebuffer's alpha values). We can't do that with the blit or 159527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * textured-quad paths. 159627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 159745e76d2665b38ba3787548310efc59e969124c01Brian Paul matching_base_formats = 159845e76d2665b38ba3787548310efc59e969124c01Brian Paul (_mesa_get_format_base_format(strb->Base.Format) == 159945e76d2665b38ba3787548310efc59e969124c01Brian Paul _mesa_get_format_base_format(texImage->TexFormat)); 160065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul format_writemask = compatible_src_dst_formats(ctx, &strb->Base, texImage); 160179931e38abc62286151121a3f59127e296144551Michel Dänzer 16028fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell if (ctx->_ImageTransferState == 0x0) { 1603b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 1604c11d582411a999ed40db4c02143dd380113e0ffdBrian Paul if (matching_base_formats && 16058fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell src_format == dest_format && 16064c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger !do_flip) 16078fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell { 16084e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* use surface_copy() / blit */ 16094c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_box src_box; 16104c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger u_box_2d_zslice(srcX, srcY, strb->surface->u.tex.first_layer, 16114c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger width, height, &src_box); 1612127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger 1613127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* for resource_copy_region(), y=0=top, always */ 1614127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger pipe->resource_copy_region(pipe, 1615127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* dest */ 1616127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger stImage->pt, 16174c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger stImage->level, 16184c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger destX, destY, destZ + stImage->face, 1619127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* src */ 1620127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger strb->texture, 16214c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger strb->surface->u.tex.level, 16224c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger &src_box); 1623a479bf62353b6517841e620122112e7565d2391cBrian Paul use_fallback = GL_FALSE; 1624cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 16258fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell else if (format_writemask && 1626e60ebebb392d1d4c47541766737b5a79685a24d5Brian Paul texBaseFormat != GL_DEPTH_COMPONENT && 1627e60ebebb392d1d4c47541766737b5a79685a24d5Brian Paul texBaseFormat != GL_DEPTH_STENCIL && 16288fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell screen->is_format_supported(screen, src_format, 1629127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger PIPE_TEXTURE_2D, sample_count, 1630287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_SAMPLER_VIEW, 16318aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca 0) && 16324e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul screen->is_format_supported(screen, dest_format, 1633127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger PIPE_TEXTURE_2D, 0, 1634287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 16358aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca 0)) { 16364e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* draw textured quad to do the copy */ 1637eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul GLint srcY0, srcY1; 16384c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_surface surf_tmpl; 16394c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger memset(&surf_tmpl, 0, sizeof(surf_tmpl)); 16404c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_tmpl.format = stImage->pt->format; 16414c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_tmpl.usage = PIPE_BIND_RENDER_TARGET; 16424c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_tmpl.u.tex.level = stImage->level; 16434c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_tmpl.u.tex.first_layer = stImage->face + destZ; 16444c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger surf_tmpl.u.tex.last_layer = stImage->face + destZ; 164527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 16464c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger dest_surface = pipe->create_surface(pipe, stImage->pt, 16474c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger &surf_tmpl); 164827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 1649a479bf62353b6517841e620122112e7565d2391cBrian Paul if (do_flip) { 1650a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY1 = strb->Base.Height - srcY - height; 1651a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY0 = srcY1 + height; 1652a479bf62353b6517841e620122112e7565d2391cBrian Paul } 1653a479bf62353b6517841e620122112e7565d2391cBrian Paul else { 1654a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY0 = srcY; 1655a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY1 = srcY0 + height; 1656a479bf62353b6517841e620122112e7565d2391cBrian Paul } 1657127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger 165876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_writemask(st->blit, 1659127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger strb->texture, 16604c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger strb->surface->u.tex.level, 16618fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell srcX, srcY0, 16628fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell srcX + width, srcY1, 16634c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger strb->surface->u.tex.first_layer, 16648fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell dest_surface, 16658fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell destX, destY, 16668fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell destX + width, destY + height, 16678fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 0.0, PIPE_TEX_MIPFILTER_NEAREST, 16688fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell format_writemask); 1669cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul use_fallback = GL_FALSE; 16703c0dc8242b64518d5635263ba65b39afa919dd86Michel Dänzer } 167179931e38abc62286151121a3f59127e296144551Michel Dänzer 167227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (dest_surface) 167327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul pipe_surface_reference(&dest_surface, NULL); 1674038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian } 1675cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul 1676cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul if (use_fallback) { 16774e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* software fallback */ 1678038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian fallback_copy_texsubimage(ctx, target, level, 16794e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul strb, stImage, texBaseFormat, 1680038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian destX, destY, destZ, 1681038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian srcX, srcY, width, height); 1682038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian } 168324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 168424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 168524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1686038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 168724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1688f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CopyTexImage1D(struct gl_context * ctx, GLenum target, GLint level, 168924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat, 169024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLint border) 169124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 169224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_unit *texUnit = 169324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 169424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj = 169524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_object(ctx, texUnit, target); 169624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage = 169724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_image(ctx, texObj, target, level); 169824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1699753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Setup or redefine the texture object, texture and texture 170024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * image. Don't populate yet. 170124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 170224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ctx->Driver.TexImage1D(ctx, target, level, internalFormat, 170324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, border, 170424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GL_RGBA, CHAN_TYPE, NULL, 170524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->DefaultPacking, texObj, texImage); 170624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 17074e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17084e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul 0, 0, 0, /* destX,Y,Z */ 17094e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, 1); /* src X, Y, size */ 171024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 171124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 171224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 171324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1714f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CopyTexImage2D(struct gl_context * ctx, GLenum target, GLint level, 171524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat, 171624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLsizei height, 171724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint border) 171824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 171924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_unit *texUnit = 172024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 172124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj = 172224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_object(ctx, texUnit, target); 172324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage = 172424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_image(ctx, texObj, target, level); 172524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1726753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Setup or redefine the texture object, texture and texture 172724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * image. Don't populate yet. 172824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 172924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ctx->Driver.TexImage2D(ctx, target, level, internalFormat, 173024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, height, border, 173124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GL_RGBA, CHAN_TYPE, NULL, 173224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->DefaultPacking, texObj, texImage); 173324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 17344e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17354e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul 0, 0, 0, /* destX,Y,Z */ 17364e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 173724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 173824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 173924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 174024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1741f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CopyTexSubImage1D(struct gl_context * ctx, GLenum target, GLint level, 174224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint x, GLint y, GLsizei width) 174324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1744038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLint yoffset = 0, zoffset = 0; 1745038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLsizei height = 1; 17464e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17474e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17484e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 174924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 175024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 175124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 175224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1753f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CopyTexSubImage2D(struct gl_context * ctx, GLenum target, GLint level, 175424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint yoffset, 175524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLsizei height) 175624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1757038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLint zoffset = 0; 17584e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17594e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17604e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 1761038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian} 176224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 176324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1764038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 1765f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CopyTexSubImage3D(struct gl_context * ctx, GLenum target, GLint level, 1766038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint xoffset, GLint yoffset, GLint zoffset, 1767038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint x, GLint y, GLsizei width, GLsizei height) 1768038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian{ 17694e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17704e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17714e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 177224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 177324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 177424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1775e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul/** 1776e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * Copy image data from stImage into the texture object 'stObj' at level 1777e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * 'dstLevel'. 1778e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 177924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1780753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzercopy_image_data_to_texture(struct st_context *st, 1781753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_object *stObj, 17824da1cdf78fa3b954840650fa46cf72da5daf149fBrian GLuint dstLevel, 1783753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_image *stImage) 178424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1785e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* debug checks */ 1786e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul { 1787e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul const struct gl_texture_image *dstImage = 1788e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->base.Image[stImage->face][stImage->level]; 1789e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage); 1790e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Width == stImage->base.Width); 1791e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Height == stImage->base.Height); 1792e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Depth == stImage->base.Depth); 1793e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 1794e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 1795753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 179624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Copy potentially with the blitter: 179724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1798753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer st_texture_image_copy(st->pipe, 17994da1cdf78fa3b954840650fa46cf72da5daf149fBrian stObj->pt, dstLevel, /* dest texture, level */ 1800c6fdb950e9fdf42fb1d6c837019df23386fffee7Brian Paul stImage->pt, stImage->level, /* src texture, level */ 1801b628950662a97452e539bcc704bd2acee70f8355Brian Paul stImage->face); 180224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1803287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 180424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 18054c50969334844bc9aa622176c3ebcbc733394f78Brian Paul else if (stImage->base.Data) { 1806e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom st_texture_image_data(st, 18075facd7986ace899673499f396897469720476799Brian Paul stObj->pt, 18085facd7986ace899673499f396897469720476799Brian Paul stImage->face, 18095facd7986ace899673499f396897469720476799Brian Paul dstLevel, 18105facd7986ace899673499f396897469720476799Brian Paul stImage->base.Data, 18115facd7986ace899673499f396897469720476799Brian Paul stImage->base.RowStride * 1812b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol util_format_get_blocksize(stObj->pt->format), 18135facd7986ace899673499f396897469720476799Brian Paul stImage->base.RowStride * 18145facd7986ace899673499f396897469720476799Brian Paul stImage->base.Height * 1815b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol util_format_get_blocksize(stObj->pt->format)); 181624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_align_free(stImage->base.Data); 181724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.Data = NULL; 181824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 181924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1820287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, stObj->pt); 182124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 182224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 182324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1824afc54983370033b65e3a7cbb29bd9c87156f0881Brian/** 1825afc54983370033b65e3a7cbb29bd9c87156f0881Brian * Called during state validation. When this function is finished, 1826afc54983370033b65e3a7cbb29bd9c87156f0881Brian * the texture object should be ready for rendering. 18273b3774b1227743147159676795b542c0eb7c2bdfBrian Paul * \return GL_TRUE for success, GL_FALSE for failure (out of mem) 182824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 182914b98343309fdcff3514f05020303f7b40e83a4aBrianGLboolean 1830f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_finalize_texture(struct gl_context *ctx, 1831c3af68dc5022715cc8f126b7df12f3f5248aefe7Keith Whitwell struct pipe_context *pipe, 1832295a87f6c211322faefc4ef7f88f02722973f5b6Brian Paul struct gl_texture_object *tObj) 183324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 183476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 183514b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_object *stObj = st_texture_object(tObj); 1836afc54983370033b65e3a7cbb29bd9c87156f0881Brian const GLuint nr_faces = (stObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 1837e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint face; 183824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *firstImage; 1839e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul enum pipe_format firstImageFormat; 184024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1841e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul if (stObj->base._Complete) { 1842e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul /* The texture is complete and we know exactly how many mipmap levels 1843e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * are present/needed. This is conditional because we may be called 1844e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * from the st_generate_mipmap() function when the texture object is 1845e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * incomplete. In that case, we'll have set stObj->lastLevel before 1846e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * we get here. 1847e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul */ 1848ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan if (stObj->base.MinFilter == GL_LINEAR || 1849ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan stObj->base.MinFilter == GL_NEAREST) 1850ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan stObj->lastLevel = stObj->base.BaseLevel; 1851ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan else 1852e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->lastLevel = stObj->base._MaxLevel; 1853e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul } 185424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 18554da1cdf78fa3b954840650fa46cf72da5daf149fBrian firstImage = st_texture_image(stObj->base.Image[0][stObj->base.BaseLevel]); 1856e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(firstImage); 185724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1858753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* If both firstImage and stObj point to a texture which can contain 185924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * all active images, favour firstImage. Note that because of the 186024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * completeness requirement, we know that the image dimensions 186124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * will match. 186224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1863753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (firstImage->pt && 1864753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer firstImage->pt != stObj->pt && 186571b889f904fcba4fbc5aafff4cb62a7201f38075Fredrik Höglund (!stObj->pt || firstImage->pt->last_level >= stObj->pt->last_level)) { 1866287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, firstImage->pt); 186740c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 186824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 186924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1870e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Find gallium format for the Mesa texture */ 1871e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul firstImageFormat = st_mesa_format_to_pipe_format(firstImage->base.TexFormat); 187224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1873ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul /* If we already have a gallium texture, check that it matches the texture 1874ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul * object's format, target, size, num_levels, etc. 187524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1876809dd9089bae70cf35cea6a75258e700e7455738Brian Paul if (stObj->pt) { 1877809dd9089bae70cf35cea6a75258e700e7455738Brian Paul if (stObj->pt->target != gl_target_to_pipe(stObj->base.Target) || 1878a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie !st_sampler_compat_formats(stObj->pt->format, firstImageFormat) || 1879529b7b355d392b1534ccd8ff7b428dc21cbfdc21Brian Paul stObj->pt->last_level < stObj->lastLevel || 1880e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->width0 != stObj->width0 || 1881e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->height0 != stObj->height0 || 1882e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->depth0 != stObj->depth0) 1883311f77198e171e9ce8ddcce91fd6a894fff1f14fBrian Paul { 1884e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* The gallium texture does not match the Mesa texture so delete the 1885e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * gallium texture now. We'll make a new one below. 1886e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 1887287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 188840c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 188976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st->dirty.st |= ST_NEW_FRAMEBUFFER; 1890809dd9089bae70cf35cea6a75258e700e7455738Brian Paul } 189124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 189224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1893ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul /* May need to create a new gallium texture: 189424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1895753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stObj->pt) { 1896e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint bindings = default_bindings(st, firstImageFormat); 18971ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 189876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul stObj->pt = st_texture_create(st, 18995390a43ce06b27f6d54bc5f237aa305b6948f2afBrian gl_target_to_pipe(stObj->base.Target), 1900e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul firstImageFormat, 1901b245840b86cf877c9b8d666edf229364a84f1deaBrian stObj->lastLevel, 1902e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0, 1903e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->height0, 1904e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->depth0, 19058283db88414f600e66510de713382c36899d4b03Brian Paul bindings); 1906a73ae3d5eb8419feab5aea26573aa41b72f941ebKeith Whitwell 19073b3774b1227743147159676795b542c0eb7c2bdfBrian Paul if (!stObj->pt) { 19083b3774b1227743147159676795b542c0eb7c2bdfBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 19093b3774b1227743147159676795b542c0eb7c2bdfBrian Paul return GL_FALSE; 19103b3774b1227743147159676795b542c0eb7c2bdfBrian Paul } 191124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 191224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1913753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Pull in any images not in the object's texture: 191424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 191524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian for (face = 0; face < nr_faces; face++) { 19164da1cdf78fa3b954840650fa46cf72da5daf149fBrian GLuint level; 19179adebe172df9fbf9ba359d949e64ce07bbef77b7Brian Paul for (level = stObj->base.BaseLevel; level <= stObj->lastLevel; level++) { 191824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = 1919e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul st_texture_image(stObj->base.Image[face][level]); 192024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1921753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Need to import images in main memory or held in other textures. 192224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1923a34b43b3f4817268ef4b3f186203b5fbafc7214eBrian if (stImage && stObj->pt != stImage->pt) { 192476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul copy_image_data_to_texture(st, stObj, level, stImage); 192524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 192624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 192724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 192824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 192924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_TRUE; 193024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 193124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 193224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 19338f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul/** 19348f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * Returns pointer to a default/dummy texture. 19358f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * This is typically used when the current shader has tex/sample instructions 19368f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * but the user has not provided a (any) texture(s). 19378f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul */ 19388f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paulstruct gl_texture_object * 19398f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paulst_get_default_texture(struct st_context *st) 19408f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul{ 19418f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul if (!st->default_texture) { 19428f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul static const GLenum target = GL_TEXTURE_2D; 19438f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul GLubyte pixels[16][16][4]; 19448f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul struct gl_texture_object *texObj; 19458f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul struct gl_texture_image *texImg; 19462002e03a5232c54988161cb629966bdce19d35deBrian Paul GLuint i, j; 19478f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19482002e03a5232c54988161cb629966bdce19d35deBrian Paul /* The ARB_fragment_program spec says (0,0,0,1) should be returned 19492002e03a5232c54988161cb629966bdce19d35deBrian Paul * when attempting to sample incomplete textures. 19502002e03a5232c54988161cb629966bdce19d35deBrian Paul */ 19512002e03a5232c54988161cb629966bdce19d35deBrian Paul for (i = 0; i < 16; i++) { 19522002e03a5232c54988161cb629966bdce19d35deBrian Paul for (j = 0; j < 16; j++) { 19532002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][0] = 0; 19542002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][1] = 0; 19552002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][2] = 0; 19562002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][3] = 255; 19572002e03a5232c54988161cb629966bdce19d35deBrian Paul } 19582002e03a5232c54988161cb629966bdce19d35deBrian Paul } 1959a7b818d53a95b549bbff942a9cb91272e0799dd5Brian Paul 19608f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj = st->ctx->Driver.NewTextureObject(st->ctx, 0, target); 19618f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19628f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texImg = _mesa_get_tex_image(st->ctx, texObj, target, 0); 19638f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19648f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul _mesa_init_teximage_fields(st->ctx, target, texImg, 19658f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 16, 16, 1, 0, /* w, h, d, border */ 196683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul GL_RGBA, MESA_FORMAT_RGBA8888); 19678f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19688f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul st_TexImage(st->ctx, 2, target, 19698f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 0, GL_RGBA, /* level, intformat */ 19708f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 16, 16, 1, 0, /* w, h, d, border */ 19718f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul GL_RGBA, GL_UNSIGNED_BYTE, pixels, 19728f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul &st->ctx->DefaultPacking, 19738f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj, texImg, 19748f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 0, 0); 19758f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19768f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->MinFilter = GL_NEAREST; 19778f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->MagFilter = GL_NEAREST; 19788f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->_Complete = GL_TRUE; 19798f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19808f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul st->default_texture = texObj; 19818f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul } 19828f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul return st->default_texture; 19838f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul} 19848f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19858f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19866da9234fd437f97267e7831f034c78b31156d939Brianvoid 19876da9234fd437f97267e7831f034c78b31156d939Brianst_init_texture_functions(struct dd_function_table *functions) 198824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 198924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->ChooseTextureFormat = st_ChooseTextureFormat; 199024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage1D = st_TexImage1D; 199124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage2D = st_TexImage2D; 199224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage3D = st_TexImage3D; 199324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage1D = st_TexSubImage1D; 199424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage2D = st_TexSubImage2D; 199524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage3D = st_TexSubImage3D; 1996578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz functions->CompressedTexSubImage1D = st_CompressedTexSubImage1D; 1997a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz functions->CompressedTexSubImage2D = st_CompressedTexSubImage2D; 1998578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz functions->CompressedTexSubImage3D = st_CompressedTexSubImage3D; 199924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexImage1D = st_CopyTexImage1D; 200024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexImage2D = st_CopyTexImage2D; 200124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexSubImage1D = st_CopyTexSubImage1D; 200224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexSubImage2D = st_CopyTexSubImage2D; 2003038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian functions->CopyTexSubImage3D = st_CopyTexSubImage3D; 200462abcb9aacc33218d0143a743c738435794b32a9Brian functions->GenerateMipmap = st_generate_mipmap; 2005038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 200624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->GetTexImage = st_GetTexImage; 200724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 200824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* compressed texture functions */ 200924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CompressedTexImage2D = st_CompressedTexImage2D; 201024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->GetCompressedTexImage = st_GetCompressedTexImage; 201124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 201224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->NewTextureObject = st_NewTextureObject; 201324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->NewTextureImage = st_NewTextureImage; 201424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->DeleteTexture = st_DeleteTextureObject; 201524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->FreeTexImageData = st_FreeTextureImageData; 201624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 201724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TextureMemCpy = do_memcpy; 2018f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian 2019f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian /* XXX Temporary until we can query pipe's texture sizes */ 2020f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian functions->TestProxyTexImage = _mesa_test_proxy_teximage; 202124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 2022