mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-10 12:30:11 +01:00
st/dri: fix OpenGL-OpenCL interop for GL_TEXTURE_BUFFER
Tested by our OpenCL team. Fixes:9c499e6759"st/mesa: don't invoke st_finalize_texture & st_convert_sampler for TBOs" Acked-by: Alex Deucher <alexander.deucher@amd.com> (cherry picked from commitdb495b8962)
This commit is contained in:
parent
dd36f7f2f7
commit
676af78077
1 changed files with 35 additions and 25 deletions
|
|
@ -1841,32 +1841,17 @@ dri2_interop_export_object(__DRIcontext *_ctx,
|
|||
return MESA_GLINTEROP_INVALID_OBJECT;
|
||||
}
|
||||
|
||||
/* From OpenCL 2.0 SDK, clCreateFromGLTexture:
|
||||
* "CL_INVALID_MIP_LEVEL if miplevel is less than the value of
|
||||
* levelbase (for OpenGL implementations) or zero (for OpenGL ES
|
||||
* implementations); or greater than the value of q (for both OpenGL
|
||||
* and OpenGL ES). levelbase and q are defined for the texture in
|
||||
* section 3.8.10 (Texture Completeness) of the OpenGL 2.1
|
||||
* specification and section 3.7.10 of the OpenGL ES 2.0."
|
||||
*/
|
||||
if (in->miplevel < obj->BaseLevel || in->miplevel > obj->_MaxLevel) {
|
||||
simple_mtx_unlock(&ctx->Shared->Mutex);
|
||||
return MESA_GLINTEROP_INVALID_MIP_LEVEL;
|
||||
}
|
||||
|
||||
if (!st_finalize_texture(ctx, st->pipe, obj, 0)) {
|
||||
simple_mtx_unlock(&ctx->Shared->Mutex);
|
||||
return MESA_GLINTEROP_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
res = st_get_texobj_resource(obj);
|
||||
if (!res) {
|
||||
/* Incomplete texture buffer object? This shouldn't really occur. */
|
||||
simple_mtx_unlock(&ctx->Shared->Mutex);
|
||||
return MESA_GLINTEROP_INVALID_OBJECT;
|
||||
}
|
||||
|
||||
if (target == GL_TEXTURE_BUFFER) {
|
||||
struct st_buffer_object *stBuf =
|
||||
st_buffer_object(obj->BufferObject);
|
||||
|
||||
if (!stBuf || !stBuf->buffer) {
|
||||
/* this shouldn't happen */
|
||||
simple_mtx_unlock(&ctx->Shared->Mutex);
|
||||
return MESA_GLINTEROP_INVALID_OBJECT;
|
||||
}
|
||||
res = stBuf->buffer;
|
||||
|
||||
out->internal_format = obj->BufferObjectFormat;
|
||||
out->buf_offset = obj->BufferOffset;
|
||||
out->buf_size = obj->BufferSize == -1 ? obj->BufferObject->Size :
|
||||
|
|
@ -1874,6 +1859,31 @@ dri2_interop_export_object(__DRIcontext *_ctx,
|
|||
|
||||
obj->BufferObject->UsageHistory |= USAGE_DISABLE_MINMAX_CACHE;
|
||||
} else {
|
||||
/* From OpenCL 2.0 SDK, clCreateFromGLTexture:
|
||||
* "CL_INVALID_MIP_LEVEL if miplevel is less than the value of
|
||||
* levelbase (for OpenGL implementations) or zero (for OpenGL ES
|
||||
* implementations); or greater than the value of q (for both OpenGL
|
||||
* and OpenGL ES). levelbase and q are defined for the texture in
|
||||
* section 3.8.10 (Texture Completeness) of the OpenGL 2.1
|
||||
* specification and section 3.7.10 of the OpenGL ES 2.0."
|
||||
*/
|
||||
if (in->miplevel < obj->BaseLevel || in->miplevel > obj->_MaxLevel) {
|
||||
simple_mtx_unlock(&ctx->Shared->Mutex);
|
||||
return MESA_GLINTEROP_INVALID_MIP_LEVEL;
|
||||
}
|
||||
|
||||
if (!st_finalize_texture(ctx, st->pipe, obj, 0)) {
|
||||
simple_mtx_unlock(&ctx->Shared->Mutex);
|
||||
return MESA_GLINTEROP_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
res = st_get_texobj_resource(obj);
|
||||
if (!res) {
|
||||
/* Incomplete texture buffer object? This shouldn't really occur. */
|
||||
simple_mtx_unlock(&ctx->Shared->Mutex);
|
||||
return MESA_GLINTEROP_INVALID_OBJECT;
|
||||
}
|
||||
|
||||
out->internal_format = obj->Image[0][0]->InternalFormat;
|
||||
out->view_minlevel = obj->MinLevel;
|
||||
out->view_numlevels = obj->NumLevels;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue