177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 2ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h" 3ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/macros.h" 445a56e4730a74a012ad712fd9b6013d900b04742Vinson Lee#include "main/mfeatures.h" 5ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/mtypes.h" 6ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/enums.h" 7ced699b37a048ea32434c222fcf83235048918bcBrian Paul#include "main/bufferobj.h" 8ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/context.h" 92073006c9566b08888b4338748a843c645bd0db1Eric Anholt#include "main/formats.h" 10b70610b9823fc7dc3672735c11be1a75fbb1a2a4Brian Paul#include "main/pbo.h" 11d09704b4e96ab333d567e3a60e77b4dba9be5e76Chad Versace#include "main/renderbuffer.h" 12ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/texcompress.h" 134d363cc16d94b1e356b7cc23bb3b15ca0374d1e3Brian Paul#include "main/texgetimage.h" 14ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/texobj.h" 15ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/teximage.h" 1666681b4c8cb1ef16f42c1591298cb30c83bca09bBrian Paul#include "main/texstore.h" 1777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 1877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_context.h" 1977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_mipmap_tree.h" 2077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_buffer_objects.h" 2177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_batchbuffer.h" 2277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_tex.h" 2377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_blit.h" 24dcbe215c015c8dc48440f578023c2b9d12b934e4Kristian Høgsberg#include "intel_fbo.h" 2501e493980c133ad20f70d627dcc1b1900e3ebf44Chad Versace#include "intel_span.h" 2677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 2777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#define FILE_DEBUG_FLAG DEBUG_TEXTURE 2877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 294ad8a0adec588b4c2c5a8f93265ed46cee5d3ff6Eric Anholt/* Work back from the specified level of the image to the baselevel and create a 304ad8a0adec588b4c2c5a8f93265ed46cee5d3ff6Eric Anholt * miptree of that size. 315b3eb7538cd9ceb967b6e9e765896183e7c2c4d4Eric Anholt */ 32e928c34d3ec54bb8a6b80036e6b6a91977bf0865Eric Anholtstruct intel_mipmap_tree * 3348024fb44cbbccd0c688949084ef249d3c1208abEric Anholtintel_miptree_create_for_teximage(struct intel_context *intel, 3448024fb44cbbccd0c688949084ef249d3c1208abEric Anholt struct intel_texture_object *intelObj, 3548024fb44cbbccd0c688949084ef249d3c1208abEric Anholt struct intel_texture_image *intelImage, 362e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke bool expect_accelerated_upload) 3777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 385b3eb7538cd9ceb967b6e9e765896183e7c2c4d4Eric Anholt GLuint firstLevel; 3977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GLuint lastLevel; 40fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt int width, height, depth; 416dcc398ac0837025cf60b4d6a056fa3b0a16466fEric Anholt GLuint i; 4277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 43fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt intel_miptree_get_dimensions_for_image(&intelImage->base.Base, 44fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt &width, &height, &depth); 45fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt 4677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt DBG("%s\n", __FUNCTION__); 4777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 48fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul if (intelImage->base.Base.Level > intelObj->base.BaseLevel && 49fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt (width == 1 || 50fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt (intelObj->base.Target != GL_TEXTURE_1D && height == 1) || 51fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt (intelObj->base.Target == GL_TEXTURE_3D && depth == 1))) { 5248024fb44cbbccd0c688949084ef249d3c1208abEric Anholt /* For this combination, we're at some lower mipmap level and 5348024fb44cbbccd0c688949084ef249d3c1208abEric Anholt * some important dimension is 1. We can't extrapolate up to a 5448024fb44cbbccd0c688949084ef249d3c1208abEric Anholt * likely base level width/height/depth for a full mipmap stack 5548024fb44cbbccd0c688949084ef249d3c1208abEric Anholt * from this info, so just allocate this one level. 5648024fb44cbbccd0c688949084ef249d3c1208abEric Anholt */ 57fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul firstLevel = intelImage->base.Base.Level; 58fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul lastLevel = intelImage->base.Base.Level; 5948024fb44cbbccd0c688949084ef249d3c1208abEric Anholt } else { 6048024fb44cbbccd0c688949084ef249d3c1208abEric Anholt /* If this image disrespects BaseLevel, allocate from level zero. 6148024fb44cbbccd0c688949084ef249d3c1208abEric Anholt * Usually BaseLevel == 0, so it's unlikely to happen. 6248024fb44cbbccd0c688949084ef249d3c1208abEric Anholt */ 63fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul if (intelImage->base.Base.Level < intelObj->base.BaseLevel) 6448024fb44cbbccd0c688949084ef249d3c1208abEric Anholt firstLevel = 0; 6548024fb44cbbccd0c688949084ef249d3c1208abEric Anholt else 6648024fb44cbbccd0c688949084ef249d3c1208abEric Anholt firstLevel = intelObj->base.BaseLevel; 6748024fb44cbbccd0c688949084ef249d3c1208abEric Anholt 6848024fb44cbbccd0c688949084ef249d3c1208abEric Anholt /* Figure out image dimensions at start level. */ 69fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul for (i = intelImage->base.Base.Level; i > firstLevel; i--) { 7048024fb44cbbccd0c688949084ef249d3c1208abEric Anholt width <<= 1; 7148024fb44cbbccd0c688949084ef249d3c1208abEric Anholt if (height != 1) 7248024fb44cbbccd0c688949084ef249d3c1208abEric Anholt height <<= 1; 7348024fb44cbbccd0c688949084ef249d3c1208abEric Anholt if (depth != 1) 7448024fb44cbbccd0c688949084ef249d3c1208abEric Anholt depth <<= 1; 7548024fb44cbbccd0c688949084ef249d3c1208abEric Anholt } 7677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 7748024fb44cbbccd0c688949084ef249d3c1208abEric Anholt /* Guess a reasonable value for lastLevel. This is probably going 7848024fb44cbbccd0c688949084ef249d3c1208abEric Anholt * to be wrong fairly often and might mean that we have to look at 7948024fb44cbbccd0c688949084ef249d3c1208abEric Anholt * resizable buffers, or require that buffers implement lazy 8048024fb44cbbccd0c688949084ef249d3c1208abEric Anholt * pagetable arrangements. 8148024fb44cbbccd0c688949084ef249d3c1208abEric Anholt */ 82ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul if ((intelObj->base.Sampler.MinFilter == GL_NEAREST || 83ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul intelObj->base.Sampler.MinFilter == GL_LINEAR) && 84fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul intelImage->base.Base.Level == firstLevel && 8548024fb44cbbccd0c688949084ef249d3c1208abEric Anholt (intel->gen < 4 || firstLevel == 0)) { 8648024fb44cbbccd0c688949084ef249d3c1208abEric Anholt lastLevel = firstLevel; 877420c9dab4aaf87e6b840410226c296c4668a48fChad Versace } else if (intelObj->base.Target == GL_TEXTURE_EXTERNAL_OES) { 887420c9dab4aaf87e6b840410226c296c4668a48fChad Versace lastLevel = firstLevel; 8948024fb44cbbccd0c688949084ef249d3c1208abEric Anholt } else { 90c1090f3019bbe0ff92455e4a9268f8957af9cda0Roland Scheidegger lastLevel = firstLevel + _mesa_logbase2(MAX2(MAX2(width, height), depth)); 9148024fb44cbbccd0c688949084ef249d3c1208abEric Anholt } 9277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 9377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 9448024fb44cbbccd0c688949084ef249d3c1208abEric Anholt return intel_miptree_create(intel, 9548024fb44cbbccd0c688949084ef249d3c1208abEric Anholt intelObj->base.Target, 96fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul intelImage->base.Base.TexFormat, 9748024fb44cbbccd0c688949084ef249d3c1208abEric Anholt firstLevel, 9848024fb44cbbccd0c688949084ef249d3c1208abEric Anholt lastLevel, 9948024fb44cbbccd0c688949084ef249d3c1208abEric Anholt width, 10048024fb44cbbccd0c688949084ef249d3c1208abEric Anholt height, 10148024fb44cbbccd0c688949084ef249d3c1208abEric Anholt depth, 10219e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry expect_accelerated_upload, 103455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry 0 /* num_samples */, 1041bd4d456cdecf7bea55f4e3dac574af54efad994Paul Berry INTEL_MSAA_LAYOUT_NONE); 10577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 10677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 10777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are actually quite a few combinations this will work for, 10877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * more than what I've listed here. 10977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 1103bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholtstatic bool 1113bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholtcheck_pbo_format(GLenum format, GLenum type, 1121f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format mesa_format) 11377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 1143bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt switch (mesa_format) { 1153bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt case MESA_FORMAT_ARGB8888: 1163bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt return (format == GL_BGRA && (type == GL_UNSIGNED_BYTE || 1173bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt type == GL_UNSIGNED_INT_8_8_8_8_REV)); 1183bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt case MESA_FORMAT_RGB565: 1193bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt return (format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5); 1203bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt case MESA_FORMAT_L8: 1213bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt return (format == GL_LUMINANCE && type == GL_UNSIGNED_BYTE); 1223bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt case MESA_FORMAT_YCBCR: 12377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return (type == GL_UNSIGNED_SHORT_8_8_MESA || type == GL_UNSIGNED_BYTE); 12477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt default: 1253bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt return false; 12677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 12777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 12877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 12977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 13077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* XXX: Do this for TexSubImage also: 13177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 1320ba23909475c085d81a5b181744c167ccbe53482Eric Anholtstatic bool 1339aff2944a449f586e32f537350e590910d09d016Eric Anholttry_pbo_upload(struct gl_context *ctx, 1349aff2944a449f586e32f537350e590910d09d016Eric Anholt struct gl_texture_image *image, 13577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt const struct gl_pixelstore_attrib *unpack, 136c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen GLenum format, GLenum type, const void *pixels) 13777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 1389aff2944a449f586e32f537350e590910d09d016Eric Anholt struct intel_texture_image *intelImage = intel_texture_image(image); 1399aff2944a449f586e32f537350e590910d09d016Eric Anholt struct intel_context *intel = intel_context(ctx); 14077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt struct intel_buffer_object *pbo = intel_buffer_object(unpack->BufferObj); 14177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GLuint src_offset, src_stride; 1422d17dbfb5346b6d75e87c839148cbe125bf5cd6dEric Anholt GLuint dst_x, dst_y, dst_stride; 1430ba23909475c085d81a5b181744c167ccbe53482Eric Anholt drm_intel_bo *dst_buffer, *src_buffer; 1440ba23909475c085d81a5b181744c167ccbe53482Eric Anholt 1450ba23909475c085d81a5b181744c167ccbe53482Eric Anholt if (!_mesa_is_bufferobj(unpack->BufferObj)) 1460ba23909475c085d81a5b181744c167ccbe53482Eric Anholt return false; 1470ba23909475c085d81a5b181744c167ccbe53482Eric Anholt 1480ba23909475c085d81a5b181744c167ccbe53482Eric Anholt DBG("trying pbo upload\n"); 14977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 1500ba23909475c085d81a5b181744c167ccbe53482Eric Anholt if (intel->ctx._ImageTransferState || 15177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt unpack->SkipPixels || unpack->SkipRows) { 1520ba23909475c085d81a5b181744c167ccbe53482Eric Anholt DBG("%s: image transfer\n", __FUNCTION__); 1530ba23909475c085d81a5b181744c167ccbe53482Eric Anholt return false; 15477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 15577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 1563bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt if (!check_pbo_format(format, type, intelImage->base.Base.TexFormat)) { 1570ba23909475c085d81a5b181744c167ccbe53482Eric Anholt DBG("%s: format mismatch (upload to %s with format 0x%x, type 0x%x)\n", 1580ba23909475c085d81a5b181744c167ccbe53482Eric Anholt __FUNCTION__, _mesa_get_format_name(intelImage->base.Base.TexFormat), 1590ba23909475c085d81a5b181744c167ccbe53482Eric Anholt format, type); 1600ba23909475c085d81a5b181744c167ccbe53482Eric Anholt return false; 1610ba23909475c085d81a5b181744c167ccbe53482Eric Anholt } 1620ba23909475c085d81a5b181744c167ccbe53482Eric Anholt 163c9a7dfcf92e6adb4b85338c2c8dbbfbaf39fbfe7Pauli Nieminen ctx->Driver.AllocTextureImageBuffer(ctx, image); 1649aff2944a449f586e32f537350e590910d09d016Eric Anholt 1659aff2944a449f586e32f537350e590910d09d016Eric Anholt if (!intelImage->mt) { 1669aff2944a449f586e32f537350e590910d09d016Eric Anholt DBG("%s: no miptree\n", __FUNCTION__); 1679aff2944a449f586e32f537350e590910d09d016Eric Anholt return false; 1689aff2944a449f586e32f537350e590910d09d016Eric Anholt } 1699aff2944a449f586e32f537350e590910d09d016Eric Anholt 1708004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt dst_buffer = intelImage->mt->region->bo; 17186939e05d232d9b882f0b427b2efad9d754f463aEric Anholt src_buffer = intel_bufferobj_source(intel, pbo, 64, &src_offset); 17236daee1c7bec44b9d3641f056c84b3b2f39fabd9Brian Paul /* note: potential 64-bit ptr to 32-bit int cast */ 17386939e05d232d9b882f0b427b2efad9d754f463aEric Anholt src_offset += (GLuint) (unsigned long) pixels; 17477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 17577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (unpack->RowLength > 0) 17677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt src_stride = unpack->RowLength; 17777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt else 178c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen src_stride = image->Width; 17977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 180fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul intel_miptree_get_image_offset(intelImage->mt, intelImage->base.Base.Level, 181fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul intelImage->base.Base.Face, 0, 1822d17dbfb5346b6d75e87c839148cbe125bf5cd6dEric Anholt &dst_x, &dst_y); 18377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 184362c1bf75eb74de5b4655c481b74f79718ed4a34Eric Anholt dst_stride = intelImage->mt->region->pitch; 18577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 18686939e05d232d9b882f0b427b2efad9d754f463aEric Anholt if (!intelEmitCopyBlit(intel, 18786939e05d232d9b882f0b427b2efad9d754f463aEric Anholt intelImage->mt->cpp, 18886939e05d232d9b882f0b427b2efad9d754f463aEric Anholt src_stride, src_buffer, 1892e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke src_offset, false, 19086939e05d232d9b882f0b427b2efad9d754f463aEric Anholt dst_stride, dst_buffer, 0, 19186939e05d232d9b882f0b427b2efad9d754f463aEric Anholt intelImage->mt->region->tiling, 192c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen 0, 0, dst_x, dst_y, image->Width, image->Height, 19386939e05d232d9b882f0b427b2efad9d754f463aEric Anholt GL_COPY)) { 19486939e05d232d9b882f0b427b2efad9d754f463aEric Anholt DBG("%s: blit failed\n", __FUNCTION__); 19586939e05d232d9b882f0b427b2efad9d754f463aEric Anholt return false; 19677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 19777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 1980ba23909475c085d81a5b181744c167ccbe53482Eric Anholt DBG("%s: success\n", __FUNCTION__); 1990ba23909475c085d81a5b181744c167ccbe53482Eric Anholt return true; 20077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 20177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 20277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 203f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergintelTexImage(struct gl_context * ctx, 2048f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul GLuint dims, 20592c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul struct gl_texture_image *texImage, 20677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GLenum format, GLenum type, const void *pixels, 2078f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul const struct gl_pixelstore_attrib *unpack) 20877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 2094ad8a0adec588b4c2c5a8f93265ed46cee5d3ff6Eric Anholt DBG("%s target %s level %d %dx%dx%d\n", __FUNCTION__, 21092c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul _mesa_lookup_enum_by_nr(texImage->TexObject->Target), 211c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen texImage->Level, texImage->Width, texImage->Height, texImage->Depth); 21277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 2130ba23909475c085d81a5b181744c167ccbe53482Eric Anholt /* Attempt to use the blitter for PBO image uploads. 21477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 21577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (dims <= 2 && 216c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen try_pbo_upload(ctx, texImage, unpack, format, type, pixels)) { 2170ba23909475c085d81a5b181744c167ccbe53482Eric Anholt return; 21877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 21977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 2209aff2944a449f586e32f537350e590910d09d016Eric Anholt DBG("%s: upload image %dx%dx%d pixels %p\n", 221c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen __FUNCTION__, texImage->Width, texImage->Height, texImage->Depth, 222c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen pixels); 22377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 224c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen _mesa_store_teximage(ctx, dims, texImage, 2258f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul format, type, pixels, unpack); 22677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 22777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 22877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 229fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt/** 230fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt * Binds a region to a texture image, like it was uploaded by glTexImage2D(). 231fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt * 232fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt * Used for GLX_EXT_texture_from_pixmap and EGL image extensions, 233fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt */ 234fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholtstatic void 235fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholtintel_set_texture_image_region(struct gl_context *ctx, 236fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt struct gl_texture_image *image, 237fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt struct intel_region *region, 238fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt GLenum target, 239fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt GLenum internalFormat, 24002ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg gl_format format, 24102ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg uint32_t offset) 242fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt{ 243fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt struct intel_context *intel = intel_context(ctx); 244fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt struct intel_texture_image *intel_image = intel_texture_image(image); 24515b58d8c2233f0e67257cb907c7d90fa23c723a5Eric Anholt struct gl_texture_object *texobj = image->TexObject; 24615b58d8c2233f0e67257cb907c7d90fa23c723a5Eric Anholt struct intel_texture_object *intel_texobj = intel_texture_object(texobj); 247fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt 248892a2542a3f0753a7064c710b96f077dd5490624Brian Paul _mesa_init_teximage_fields(&intel->ctx, image, 249fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt region->width, region->height, 1, 250fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt 0, internalFormat, format); 251fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt 252d430e81c3287eba4ee84ca1639a23f92bbe22c8eEric Anholt ctx->Driver.FreeTextureImageBuffer(ctx, image); 253fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt 254fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt intel_image->mt = intel_miptree_create_for_region(intel, target, 255fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt image->TexFormat, 256fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt region); 257fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt if (intel_image->mt == NULL) 258fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt return; 259fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt 26002ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg intel_image->mt->offset = offset; 2616e0f9001fe3fb191c2928bd09aa9e9d05ddf4ea9Brian Paul intel_image->base.RowStride = region->pitch; 26215b58d8c2233f0e67257cb907c7d90fa23c723a5Eric Anholt 26315b58d8c2233f0e67257cb907c7d90fa23c723a5Eric Anholt /* Immediately validate the image to the object. */ 26415b58d8c2233f0e67257cb907c7d90fa23c723a5Eric Anholt intel_miptree_reference(&intel_texobj->mt, intel_image->mt); 265fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt} 266fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt 2676d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergvoid 26866175aac7609ad314f25fbdff0d3958af310dc24Eric AnholtintelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target, 269debf00e5fc3828f63e0f99d72c7fa6cd6ce012c5Kristian Høgsberg GLint texture_format, 27066175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt __DRIdrawable *dPriv) 2716d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg{ 272d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg struct gl_framebuffer *fb = dPriv->driverPrivate; 273e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg struct intel_context *intel = pDRICtx->driverPrivate; 274f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = &intel->ctx; 2756d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg struct intel_texture_object *intelObj; 276dcbe215c015c8dc48440f578023c2b9d12b934e4Kristian Høgsberg struct intel_renderbuffer *rb; 2776d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg struct gl_texture_object *texObj; 2786d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg struct gl_texture_image *texImage; 2791c1040dcf02898fe99316ea2bf5482a5bb2356cfEric Anholt int level = 0, internalFormat = 0; 2801c1040dcf02898fe99316ea2bf5482a5bb2356cfEric Anholt gl_format texFormat = MESA_FORMAT_NONE; 2816d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg 282ee7dfbbd6cc85f221b371bf512bd1571744158e8Eric Anholt texObj = _mesa_get_current_tex_object(ctx, target); 2836d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg intelObj = intel_texture_object(texObj); 2846d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg 2856d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg if (!intelObj) 2866d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg return; 2876d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg 288f829e76d8835382b8a52224dfbb2556360e41ffcKristian Høgsberg if (dPriv->lastStamp != dPriv->dri2.stamp || 289f829e76d8835382b8a52224dfbb2556360e41ffcKristian Høgsberg !pDRICtx->driScreenPriv->dri2.useInvalidate) 290f829e76d8835382b8a52224dfbb2556360e41ffcKristian Høgsberg intel_update_renderbuffers(pDRICtx, dPriv); 291dcbe215c015c8dc48440f578023c2b9d12b934e4Kristian Høgsberg 292d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT); 29334bba445a12f7b81654a416fd1630c8890cfc178Eric Anholt /* If the region isn't set, then intel_update_renderbuffers was unable 29434bba445a12f7b81654a416fd1630c8890cfc178Eric Anholt * to get the buffers for the drawable. 29534bba445a12f7b81654a416fd1630c8890cfc178Eric Anholt */ 296da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace if (!rb || !rb->mt) 29734bba445a12f7b81654a416fd1630c8890cfc178Eric Anholt return; 29834bba445a12f7b81654a416fd1630c8890cfc178Eric Anholt 2997b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie if (rb->mt->cpp == 4) { 3007b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie if (texture_format == __DRI_TEXTURE_FORMAT_RGB) { 3017b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie internalFormat = GL_RGB; 3027b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie texFormat = MESA_FORMAT_XRGB8888; 3037b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie } 3047b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie else { 3057b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie internalFormat = GL_RGBA; 3067b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie texFormat = MESA_FORMAT_ARGB8888; 3077b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie } 3087b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie } else if (rb->mt->cpp == 2) { 30966175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt internalFormat = GL_RGB; 3107b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie texFormat = MESA_FORMAT_RGB565; 31183e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul } 3126d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg 3136d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg _mesa_lock_texture(&intel->ctx, texObj); 314fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt texImage = _mesa_get_tex_image(ctx, texObj, target, level); 315da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace intel_set_texture_image_region(ctx, texImage, rb->mt->region, target, 31602ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg internalFormat, texFormat, 0); 3176d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg _mesa_unlock_texture(&intel->ctx, texObj); 3186d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg} 31966175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt 32066175aac7609ad314f25fbdff0d3958af310dc24Eric Anholtvoid 32166175aac7609ad314f25fbdff0d3958af310dc24Eric AnholtintelSetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv) 32266175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt{ 32366175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt /* The old interface didn't have the format argument, so copy our 32466175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt * implementation's behavior at the time. 32566175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt */ 326debf00e5fc3828f63e0f99d72c7fa6cd6ce012c5Kristian Høgsberg intelSetTexBuffer2(pDRICtx, target, __DRI_TEXTURE_FORMAT_RGBA, dPriv); 32766175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt} 32889205a8760b8a4651962b1ff0206699cbcd78d75Brian Paul 32910e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg#if FEATURE_OES_EGL_image 33010e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsbergstatic void 331f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergintel_image_target_texture_2d(struct gl_context *ctx, GLenum target, 33210e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg struct gl_texture_object *texObj, 33310e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg struct gl_texture_image *texImage, 33410e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg GLeglImageOES image_handle) 33510e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg{ 33610e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg struct intel_context *intel = intel_context(ctx); 33710e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg __DRIscreen *screen; 33810e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg __DRIimage *image; 33910e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg 34010e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg screen = intel->intelScreen->driScrnPriv; 34117eace581d25a626a7d75d9d1205d012cbb14a6eKristian Høgsberg image = screen->dri2.image->lookupEGLImage(screen, image_handle, 34217eace581d25a626a7d75d9d1205d012cbb14a6eKristian Høgsberg screen->loaderPrivate); 34310e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg if (image == NULL) 34410e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg return; 34510e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg 346fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt intel_set_texture_image_region(ctx, texImage, image->region, 34702ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg target, image->internal_format, 34895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->format, image->offset); 34910e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg} 35010e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg#endif 35189205a8760b8a4651962b1ff0206699cbcd78d75Brian Paul 35289205a8760b8a4651962b1ff0206699cbcd78d75Brian Paulvoid 35389205a8760b8a4651962b1ff0206699cbcd78d75Brian PaulintelInitTextureImageFuncs(struct dd_function_table *functions) 35489205a8760b8a4651962b1ff0206699cbcd78d75Brian Paul{ 3558f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul functions->TexImage = intelTexImage; 35689205a8760b8a4651962b1ff0206699cbcd78d75Brian Paul 35710e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg#if FEATURE_OES_EGL_image 35810e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg functions->EGLImageTargetTexture2D = intel_image_target_texture_2d; 35910e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg#endif 36089205a8760b8a4651962b1ff0206699cbcd78d75Brian Paul} 361