#include "main/texobj.h"
#include "main/teximage.h"
#include "main/texstore.h"
+#include "main/glthread.h"
#include "drivers/common/meta.h"
#include "intel_buffer_objects.h"
#include "intel_batchbuffer.h"
#include "intel_tex.h"
-#include "intel_blit.h"
#include "intel_fbo.h"
#include "intel_image.h"
-#include "intel_tiled_memcpy.h"
#include "brw_context.h"
#include "brw_blorp.h"
struct brw_bo *bo;
uint32_t cpp;
- mem_copy_fn mem_copy = NULL;
+ isl_memcpy_type copy_type;
/* This fastpath is restricted to specific texture types:
* a 2D BGRA, RGBA, L8 or A8 texture. It could be generalized to support
if (ctx->_ImageTransferState)
return false;
- if (!intel_get_memcpy(texImage->TexFormat, format, type, &mem_copy, &cpp))
+ copy_type = intel_miptree_get_memcpy_type(texImage->TexFormat, format, type,
+ &cpp);
+ if (copy_type == ISL_MEMCPY_INVALID)
return false;
/* If this is a nontrivial texture view, let another path handle it instead. */
xoffset += level_x;
yoffset += level_y;
- linear_to_tiled(
+ isl_memcpy_linear_to_tiled(
xoffset * cpp, (xoffset + width) * cpp,
yoffset, yoffset + height,
map,
- pixels - (ptrdiff_t) yoffset * src_pitch - (ptrdiff_t) xoffset * cpp,
- image->mt->surf.row_pitch, src_pitch,
+ pixels,
+ image->mt->surf.row_pitch_B, src_pitch,
brw->has_swizzling,
image->mt->surf.tiling,
- mem_copy
+ copy_type
);
brw_bo_unmap(bo);
bool tex_busy = mt && brw_bo_busy(mt->bo);
- if (mt && mt->format == MESA_FORMAT_S_UINT8)
- mt->r8stencil_needs_update = true;
-
if (_mesa_is_bufferobj(packing->BufferObj) || tex_busy ||
mt->aux_usage == ISL_AUX_USAGE_CCS_E) {
ok = intel_texsubimage_blorp(brw, dims, texImage,
intel_set_texture_image_mt(struct brw_context *brw,
struct gl_texture_image *image,
GLenum internal_format,
+ mesa_format format,
struct intel_mipmap_tree *mt)
{
_mesa_init_teximage_fields(&brw->ctx, image,
mt->surf.logical_level0_px.width,
mt->surf.logical_level0_px.height, 1,
- 0, internal_format, mt->format);
+ 0, internal_format, format);
brw->ctx.Driver.FreeTextureImageBuffer(&brw->ctx, image);
intel_texobj->needs_validate = true;
- intel_image->base.RowStride = mt->surf.row_pitch / mt->cpp;
- assert(mt->surf.row_pitch % mt->cpp == 0);
+ intel_image->base.RowStride = mt->surf.row_pitch_B / mt->cpp;
+ assert(mt->surf.row_pitch_B % mt->cpp == 0);
intel_miptree_reference(&intel_image->mt, mt);
struct intel_renderbuffer *rb;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
+ mesa_format texFormat = MESA_FORMAT_NONE;
GLenum internal_format = 0;
+ _mesa_glthread_finish(ctx);
+
texObj = _mesa_get_current_tex_object(ctx, target);
if (!texObj)
if (!rb || !rb->mt)
return;
+ /* Neither the EGL and GLX texture_from_pixmap specs say anything about
+ * sRGB. They are both from a time where sRGB was considered an extra
+ * encoding step you did as part of rendering/blending and not a format.
+ * Even though we have concept of sRGB visuals, X has classically assumed
+ * that your data is just bits and sRGB rendering is entirely a client-side
+ * rendering construct. The assumption is that the result of BindTexImage
+ * is a texture with a linear format even if it was rendered with sRGB
+ * encoding enabled.
+ */
+ texFormat = _mesa_get_srgb_format_linear(intel_rb_format(rb));
+
if (rb->mt->cpp == 4) {
+ /* The extra texture_format parameter indicates whether the alpha
+ * channel should be respected or ignored. If we set internal_format to
+ * GL_RGB, the texture handling code is smart enough to swap the format
+ * or apply a swizzle if the underlying format is RGBA so we don't need
+ * to stomp it to RGBX or anything like that.
+ */
if (texture_format == __DRI_TEXTURE_FORMAT_RGB)
internal_format = GL_RGB;
else
internal_format = GL_RGBA;
} else if (rb->mt->cpp == 2) {
- /* This is 565 */
internal_format = GL_RGB;
}
- intel_miptree_prepare_external(brw, rb->mt);
+ intel_miptree_finish_external(brw, rb->mt);
_mesa_lock_texture(&brw->ctx, texObj);
texImage = _mesa_get_tex_image(ctx, texObj, target, 0);
- intel_set_texture_image_mt(brw, texImage, internal_format, rb->mt);
+ intel_set_texture_image_mt(brw, texImage, internal_format,
+ texFormat, rb->mt);
_mesa_unlock_texture(&brw->ctx, texObj);
}
+void
+intelReleaseTexBuffer(__DRIcontext *pDRICtx, GLint target,
+ __DRIdrawable *dPriv)
+{
+ struct brw_context *brw = pDRICtx->driverPrivate;
+ struct gl_context *ctx = &brw->ctx;
+ struct gl_texture_object *tex_obj;
+ struct intel_texture_object *intel_tex;
+
+ tex_obj = _mesa_get_current_tex_object(ctx, target);
+ if (!tex_obj)
+ return;
+
+ _mesa_lock_texture(&brw->ctx, tex_obj);
+
+ intel_tex = intel_texture_object(tex_obj);
+ if (!intel_tex->mt) {
+ _mesa_unlock_texture(&brw->ctx, tex_obj);
+ return;
+ }
+
+ /* The intel_miptree_prepare_external below as well as the finish_external
+ * above in intelSetTexBuffer2 *should* do nothing. The BindTexImage call
+ * from both GLX and EGL has TexImage2D and not TexSubImage2D semantics so
+ * the texture is not immutable. This means that the user cannot create a
+ * texture view of the image with a different format. Since the only three
+ * formats available when using BindTexImage are all UNORM, we can never
+ * end up with an sRGB format being used for texturing and so we shouldn't
+ * get any format-related resolves when texturing from it.
+ *
+ * While very unlikely, it is possible that the client could use the bound
+ * texture with GL_ARB_image_load_store. In that case, we'll do a resolve
+ * but that's not actually a problem as it just means that we lose
+ * compression on this texture until the next time it's used as a render
+ * target.
+ *
+ * The only other way we could end up with an unexpected aux usage would be
+ * if we rendered to the image from the same context as we have it bound as
+ * a texture between BindTexImage and ReleaseTexImage. However, the spec
+ * clearly calls this case out and says you shouldn't do that. It doesn't
+ * explicitly prevent binding the texture to a framebuffer but it says the
+ * results of trying to render to it while bound are undefined.
+ *
+ * Just to keep everything safe and sane, we do a prepare_external but it
+ * should be a no-op in almost all cases. On the off chance that someone
+ * ever triggers this, we should at least warn them.
+ */
+ if (intel_tex->mt->aux_buf &&
+ intel_miptree_get_aux_state(intel_tex->mt, 0, 0) !=
+ isl_drm_modifier_get_default_aux_state(intel_tex->mt->drm_modifier)) {
+ _mesa_warning(ctx, "Aux state changed between BindTexImage and "
+ "ReleaseTexImage. Most likely someone tried to draw "
+ "to the pixmap bound in BindTexImage or used it with "
+ "image_load_store.");
+ }
+
+ intel_miptree_prepare_external(brw, intel_tex->mt);
+
+ _mesa_unlock_texture(&brw->ctx, tex_obj);
+}
+
static GLboolean
intel_bind_renderbuffer_tex_image(struct gl_context *ctx,
struct gl_renderbuffer *rb,
if (image == NULL)
return;
- /* We support external textures only for EGLImages created with
- * EGL_EXT_image_dma_buf_import. We may lift that restriction in the future.
- */
- if (target == GL_TEXTURE_EXTERNAL_OES && !image->dma_buf_imported) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glEGLImageTargetTexture2DOES(external target is enabled only "
- "for images created with EGL_EXT_image_dma_buf_import");
- return;
- }
-
/* Disallow depth/stencil textures: we don't have a way to pass the
* separate stencil miptree of a GL_DEPTH_STENCIL texture through.
*/
const GLenum internal_format =
image->internal_format != 0 ?
image->internal_format : _mesa_get_format_base_format(mt->format);
- intel_set_texture_image_mt(brw, texImage, internal_format, mt);
+ intel_set_texture_image_mt(brw, texImage, internal_format, mt->format, mt);
intel_miptree_release(&mt);
}
struct brw_bo *bo;
uint32_t cpp;
- mem_copy_fn mem_copy = NULL;
+ isl_memcpy_type copy_type;
/* This fastpath is restricted to specific texture types:
* a 2D BGRA, RGBA, L8 or A8 texture. It could be generalized to support
if (texImage->_BaseFormat == GL_RGB)
return false;
- if (!intel_get_memcpy(texImage->TexFormat, format, type, &mem_copy, &cpp))
+ copy_type = intel_miptree_get_memcpy_type(texImage->TexFormat, format, type,
+ &cpp);
+ if (copy_type == ISL_MEMCPY_INVALID)
return false;
/* If this is a nontrivial texture view, let another path handle it instead. */
xoffset += level_x;
yoffset += level_y;
- tiled_to_linear(
+ isl_memcpy_tiled_to_linear(
xoffset * cpp, (xoffset + width) * cpp,
yoffset, yoffset + height,
- pixels - (ptrdiff_t) yoffset * dst_pitch - (ptrdiff_t) xoffset * cpp,
+ pixels,
map,
- dst_pitch, image->mt->surf.row_pitch,
+ dst_pitch, image->mt->surf.row_pitch_B,
brw->has_swizzling,
image->mt->surf.tiling,
- mem_copy
+ copy_type
);
brw_bo_unmap(bo);
!_mesa_is_srgb_format(gl_format);
struct brw_context *brw = (struct brw_context*) ctx;
const struct gen_device_info *devinfo = &brw->screen->devinfo;
- if (devinfo->gen == 9 && is_linear_astc)
+ if (devinfo->gen == 9 && !gen_device_info_is_9lp(devinfo) && is_linear_astc)
flush_astc_denorms(ctx, dims, texImage,
xoffset, yoffset, zoffset,
width, height, depth);