Re: [Mesa-dev] [PATCH] st/dri: fix OpenGL-OpenCL interop for GL_TEXTURE_BUFFER

2018-03-08 Thread Alex Deucher
On Wed, Mar 7, 2018 at 3:35 PM, Marek Olšák  wrote:
> From: Marek Olšák 
>
> Tested by our OpenCL team.
>
> Fixes: 9c499e6759b26c5e "st/mesa: don't invoke st_finalize_texture & 
> st_convert_sampler for TBOs"

Acked-by: Alex Deucher 

> ---
>  src/gallium/state_trackers/dri/dri2.c | 58 
> ---
>  1 file changed, 34 insertions(+), 24 deletions(-)
>
> diff --git a/src/gallium/state_trackers/dri/dri2.c 
> b/src/gallium/state_trackers/dri/dri2.c
> index 2a3a2a8..31d17d4 100644
> --- a/src/gallium/state_trackers/dri/dri2.c
> +++ b/src/gallium/state_trackers/dri/dri2.c
> @@ -1870,53 +1870,63 @@ dri2_interop_export_object(__DRIcontext *_ctx,
> *miplevel is zero or if the GL texture object is incomplete."
> */
>if (!obj ||
>obj->Target != target ||
>!obj->_BaseComplete ||
>(in->miplevel > 0 && !obj->_MipmapComplete)) {
>   simple_mtx_unlock(>Shared->Mutex);
>   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(>Shared->Mutex);
> - return MESA_GLINTEROP_INVALID_MIP_LEVEL;
> -  }
> -
> -  if (!st_finalize_texture(ctx, st->pipe, obj, 0)) {
> - simple_mtx_unlock(>Shared->Mutex);
> - return MESA_GLINTEROP_OUT_OF_RESOURCES;
> -  }
> +  if (target == GL_TEXTURE_BUFFER) {
> + struct st_buffer_object *stBuf =
> +st_buffer_object(obj->BufferObject);
>
> -  res = st_get_texobj_resource(obj);
> -  if (!res) {
> - /* Incomplete texture buffer object? This shouldn't really occur. */
> - simple_mtx_unlock(>Shared->Mutex);
> - return MESA_GLINTEROP_INVALID_OBJECT;
> -  }
> + if (!stBuf || !stBuf->buffer) {
> +/* this shouldn't happen */
> +simple_mtx_unlock(>Shared->Mutex);
> +return MESA_GLINTEROP_INVALID_OBJECT;
> + }
> + res = stBuf->buffer;
>
> -  if (target == GL_TEXTURE_BUFFER) {
>   out->internal_format = obj->BufferObjectFormat;
>   out->buf_offset = obj->BufferOffset;
>   out->buf_size = obj->BufferSize == -1 ? obj->BufferObject->Size :
>   obj->BufferSize;
>
>   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(>Shared->Mutex);
> +return MESA_GLINTEROP_INVALID_MIP_LEVEL;
> + }
> +
> + if (!st_finalize_texture(ctx, st->pipe, obj, 0)) {
> +simple_mtx_unlock(>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(>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;
>   out->view_minlayer = obj->MinLayer;
>   out->view_numlayers = obj->NumLayers;
>}
> }
>
> /* Get the handle. */
> switch (in->access) {
> --
> 2.7.4
>
> ___
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] st/dri: fix OpenGL-OpenCL interop for GL_TEXTURE_BUFFER

2018-03-07 Thread Marek Olšák
From: Marek Olšák 

Tested by our OpenCL team.

Fixes: 9c499e6759b26c5e "st/mesa: don't invoke st_finalize_texture & 
st_convert_sampler for TBOs"
---
 src/gallium/state_trackers/dri/dri2.c | 58 ---
 1 file changed, 34 insertions(+), 24 deletions(-)

diff --git a/src/gallium/state_trackers/dri/dri2.c 
b/src/gallium/state_trackers/dri/dri2.c
index 2a3a2a8..31d17d4 100644
--- a/src/gallium/state_trackers/dri/dri2.c
+++ b/src/gallium/state_trackers/dri/dri2.c
@@ -1870,53 +1870,63 @@ dri2_interop_export_object(__DRIcontext *_ctx,
*miplevel is zero or if the GL texture object is incomplete."
*/
   if (!obj ||
   obj->Target != target ||
   !obj->_BaseComplete ||
   (in->miplevel > 0 && !obj->_MipmapComplete)) {
  simple_mtx_unlock(>Shared->Mutex);
  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(>Shared->Mutex);
- return MESA_GLINTEROP_INVALID_MIP_LEVEL;
-  }
-
-  if (!st_finalize_texture(ctx, st->pipe, obj, 0)) {
- simple_mtx_unlock(>Shared->Mutex);
- return MESA_GLINTEROP_OUT_OF_RESOURCES;
-  }
+  if (target == GL_TEXTURE_BUFFER) {
+ struct st_buffer_object *stBuf =
+st_buffer_object(obj->BufferObject);
 
-  res = st_get_texobj_resource(obj);
-  if (!res) {
- /* Incomplete texture buffer object? This shouldn't really occur. */
- simple_mtx_unlock(>Shared->Mutex);
- return MESA_GLINTEROP_INVALID_OBJECT;
-  }
+ if (!stBuf || !stBuf->buffer) {
+/* this shouldn't happen */
+simple_mtx_unlock(>Shared->Mutex);
+return MESA_GLINTEROP_INVALID_OBJECT;
+ }
+ res = stBuf->buffer;
 
-  if (target == GL_TEXTURE_BUFFER) {
  out->internal_format = obj->BufferObjectFormat;
  out->buf_offset = obj->BufferOffset;
  out->buf_size = obj->BufferSize == -1 ? obj->BufferObject->Size :
  obj->BufferSize;
 
  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(>Shared->Mutex);
+return MESA_GLINTEROP_INVALID_MIP_LEVEL;
+ }
+
+ if (!st_finalize_texture(ctx, st->pipe, obj, 0)) {
+simple_mtx_unlock(>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(>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;
  out->view_minlayer = obj->MinLayer;
  out->view_numlayers = obj->NumLayers;
   }
}
 
/* Get the handle. */
switch (in->access) {
-- 
2.7.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev