add software driver copy_sub_buffer support from upstream
This commit is contained in:
		
							parent
							
								
									08bc8bfdeb
								
							
						
					
					
						commit
						ddf49f2d51
					
				| @ -1,224 +0,0 @@ | ||||
| From 430343da5988f53ee6eedffb55ab38fa7cf64fd5 Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= <maraeo@gmail.com> | ||||
| Date: Fri, 10 May 2013 03:42:23 +0200 | ||||
| Subject: [PATCH] st/mesa: handle texture_from_pixmap and other surface-based | ||||
|  textures correctly | ||||
| 
 | ||||
| There were 2 issues with it: | ||||
| 1) The texture format which should be used for texturing was only set | ||||
|    in gl_texture_image::TexFormat, which wasn't used for sampler views. | ||||
| 2) Textures are sometimes reallocated under some circumstances | ||||
|    in st_finalize_texture, which is unacceptable if the texture comes | ||||
|    from a window system. | ||||
| 
 | ||||
| The issues are resolved as follows: | ||||
| 1) If surface_based is true (texture_from_pixmap, etc.), store the format | ||||
|    in a new variable st_texture_object::surface_format. | ||||
| 2) Don't reallocate a surface-based texture in st_finalize_texture. | ||||
| 
 | ||||
| Also don't use st_ChooseTextureFormat is st_context_teximage, because | ||||
| the format is dictated by the caller. | ||||
| 
 | ||||
| This fixes the glx-tfp piglit test. | ||||
| ---
 | ||||
|  src/mesa/state_tracker/st_atom_texture.c |  3 ++- | ||||
|  src/mesa/state_tracker/st_cb_eglimage.c  |  1 + | ||||
|  src/mesa/state_tracker/st_cb_texture.c   |  7 ++++++- | ||||
|  src/mesa/state_tracker/st_format.c       | 35 -------------------------------- | ||||
|  src/mesa/state_tracker/st_format.h       |  4 ---- | ||||
|  src/mesa/state_tracker/st_manager.c      | 25 +++++------------------ | ||||
|  src/mesa/state_tracker/st_texture.h      | 10 +++++++-- | ||||
|  7 files changed, 22 insertions(+), 63 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
 | ||||
| index 8d1250f..d79e04c 100644
 | ||||
| --- a/src/mesa/state_tracker/st_atom_texture.c
 | ||||
| +++ b/src/mesa/state_tracker/st_atom_texture.c
 | ||||
| @@ -239,7 +239,8 @@ update_single_texture(struct st_context *st,
 | ||||
|           st_mesa_format_to_pipe_format(stObj->base._BufferObjectFormat); | ||||
|     } | ||||
|     else { | ||||
| -      view_format = stObj->pt->format;
 | ||||
| +      view_format =
 | ||||
| +         stObj->surface_based ? stObj->surface_format : stObj->pt->format;
 | ||||
|   | ||||
|        /* If sRGB decoding is off, use the linear format */ | ||||
|        if (samp->sRGBDecode == GL_SKIP_DECODE_EXT) { | ||||
| diff --git a/src/mesa/state_tracker/st_cb_eglimage.c b/src/mesa/state_tracker/st_cb_eglimage.c
 | ||||
| index b162870..a396b9e 100644
 | ||||
| --- a/src/mesa/state_tracker/st_cb_eglimage.c
 | ||||
| +++ b/src/mesa/state_tracker/st_cb_eglimage.c
 | ||||
| @@ -131,6 +131,7 @@ st_bind_surface(struct gl_context *ctx, GLenum target,
 | ||||
|     stObj->width0 = ps->width; | ||||
|     stObj->height0 = ps->height; | ||||
|     stObj->depth0 = 1; | ||||
| +   stObj->surface_format = ps->format;
 | ||||
|   | ||||
|     _mesa_dirty_texobj(ctx, texObj, GL_TRUE); | ||||
|  } | ||||
| diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
 | ||||
| index 123ed2b..56dbe85 100644
 | ||||
| --- a/src/mesa/state_tracker/st_cb_texture.c
 | ||||
| +++ b/src/mesa/state_tracker/st_cb_texture.c
 | ||||
| @@ -1540,6 +1540,11 @@ st_finalize_texture(struct gl_context *ctx,
 | ||||
|        pipe_sampler_view_release(st->pipe, &stObj->sampler_view); | ||||
|     } | ||||
|   | ||||
| +   /* If this texture comes from a window system, there is nothing else to do. */
 | ||||
| +   if (stObj->surface_based) {
 | ||||
| +      return GL_TRUE;
 | ||||
| +   }
 | ||||
| +
 | ||||
|     /* Find gallium format for the Mesa texture */ | ||||
|     firstImageFormat = st_mesa_format_to_pipe_format(firstImage->base.TexFormat); | ||||
|   | ||||
| @@ -1567,7 +1572,7 @@ st_finalize_texture(struct gl_context *ctx,
 | ||||
|      */ | ||||
|     if (stObj->pt) { | ||||
|        if (stObj->pt->target != gl_target_to_pipe(stObj->base.Target) || | ||||
| -          !st_sampler_compat_formats(stObj->pt->format, firstImageFormat) ||
 | ||||
| +          stObj->pt->format != firstImageFormat ||
 | ||||
|            stObj->pt->last_level < stObj->lastLevel || | ||||
|            stObj->pt->width0 != ptWidth || | ||||
|            stObj->pt->height0 != ptHeight || | ||||
| diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
 | ||||
| index c9c6163..56f3a4a 100644
 | ||||
| --- a/src/mesa/state_tracker/st_format.c
 | ||||
| +++ b/src/mesa/state_tracker/st_format.c
 | ||||
| @@ -1800,41 +1800,6 @@ st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target,
 | ||||
|  } | ||||
|   | ||||
|   | ||||
| -GLboolean
 | ||||
| -st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
 | ||||
| -{
 | ||||
| -   if (format1 == format2)
 | ||||
| -      return GL_TRUE;
 | ||||
| -
 | ||||
| -   if (format1 == PIPE_FORMAT_B8G8R8A8_UNORM &&
 | ||||
| -       format2 == PIPE_FORMAT_B8G8R8X8_UNORM)
 | ||||
| -      return GL_TRUE;
 | ||||
| -
 | ||||
| -   if (format1 == PIPE_FORMAT_B8G8R8X8_UNORM &&
 | ||||
| -       format2 == PIPE_FORMAT_B8G8R8A8_UNORM)
 | ||||
| -      return GL_TRUE;
 | ||||
| -
 | ||||
| -   if (format1 == PIPE_FORMAT_A8B8G8R8_UNORM &&
 | ||||
| -       format2 == PIPE_FORMAT_X8B8G8R8_UNORM)
 | ||||
| -      return GL_TRUE;
 | ||||
| -
 | ||||
| -   if (format1 == PIPE_FORMAT_X8B8G8R8_UNORM &&
 | ||||
| -       format2 == PIPE_FORMAT_A8B8G8R8_UNORM)
 | ||||
| -      return GL_TRUE;
 | ||||
| -
 | ||||
| -   if (format1 == PIPE_FORMAT_A8R8G8B8_UNORM &&
 | ||||
| -       format2 == PIPE_FORMAT_X8R8G8B8_UNORM)
 | ||||
| -      return GL_TRUE;
 | ||||
| -
 | ||||
| -   if (format1 == PIPE_FORMAT_X8R8G8B8_UNORM &&
 | ||||
| -       format2 == PIPE_FORMAT_A8R8G8B8_UNORM)
 | ||||
| -      return GL_TRUE;
 | ||||
| -
 | ||||
| -   return GL_FALSE;
 | ||||
| -}
 | ||||
| -
 | ||||
| -
 | ||||
| -
 | ||||
|  /** | ||||
|   * This is used for translating texture border color and the clear | ||||
|   * color.  For example, the clear color is interpreted according to | ||||
| diff --git a/src/mesa/state_tracker/st_format.h b/src/mesa/state_tracker/st_format.h
 | ||||
| index 0a1c18d..6e97dcb 100644
 | ||||
| --- a/src/mesa/state_tracker/st_format.h
 | ||||
| +++ b/src/mesa/state_tracker/st_format.h
 | ||||
| @@ -70,10 +70,6 @@ size_t
 | ||||
|  st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target, | ||||
|                           GLenum internalFormat, int samples[16]); | ||||
|   | ||||
| -/* can we use a sampler view to translate these formats
 | ||||
| -   only used to make TFP so far */
 | ||||
| -extern GLboolean
 | ||||
| -st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2);
 | ||||
|   | ||||
|   | ||||
|  extern void | ||||
| diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
 | ||||
| index 5561af6..9e537f3 100644
 | ||||
| --- a/src/mesa/state_tracker/st_manager.c
 | ||||
| +++ b/src/mesa/state_tracker/st_manager.c
 | ||||
| @@ -467,7 +467,7 @@ st_context_flush(struct st_context_iface *stctxi, unsigned flags,
 | ||||
|  static boolean | ||||
|  st_context_teximage(struct st_context_iface *stctxi, | ||||
|                      enum st_texture_type tex_type, | ||||
| -                    int level, enum pipe_format internal_format,
 | ||||
| +                    int level, enum pipe_format pipe_format,
 | ||||
|                      struct pipe_resource *tex, boolean mipmap) | ||||
|  { | ||||
|     struct st_context *st = (struct st_context *) stctxi; | ||||
| @@ -511,29 +511,13 @@ st_context_teximage(struct st_context_iface *stctxi,
 | ||||
|     texImage = _mesa_get_tex_image(ctx, texObj, target, level); | ||||
|     stImage = st_texture_image(texImage); | ||||
|     if (tex) { | ||||
| -      gl_format texFormat;
 | ||||
| -
 | ||||
| -      /*
 | ||||
| -       * XXX When internal_format and tex->format differ, st_finalize_texture
 | ||||
| -       * needs to allocate a new texture with internal_format and copy the
 | ||||
| -       * texture here into the new one.  It will result in surface_copy being
 | ||||
| -       * called on surfaces whose formats differ.
 | ||||
| -       *
 | ||||
| -       * To avoid that, internal_format is (wrongly) ignored here.  A sane fix
 | ||||
| -       * is to use a sampler view.
 | ||||
| -       */
 | ||||
| -      if (!st_sampler_compat_formats(tex->format, internal_format))
 | ||||
| -	 internal_format = tex->format;
 | ||||
| -     
 | ||||
| -      if (util_format_get_component_bits(internal_format,
 | ||||
| -               UTIL_FORMAT_COLORSPACE_RGB, 3) > 0)
 | ||||
| +      gl_format texFormat = st_pipe_format_to_mesa_format(pipe_format);
 | ||||
| +
 | ||||
| +      if (util_format_has_alpha(tex->format))
 | ||||
|           internalFormat = GL_RGBA; | ||||
|        else | ||||
|           internalFormat = GL_RGB; | ||||
|   | ||||
| -      texFormat = st_ChooseTextureFormat(ctx, target, internalFormat,
 | ||||
| -                                         GL_BGRA, GL_UNSIGNED_BYTE);
 | ||||
| -
 | ||||
|        _mesa_init_teximage_fields(ctx, texImage, | ||||
|                                   tex->width0, tex->height0, 1, 0, | ||||
|                                   internalFormat, texFormat); | ||||
| @@ -562,6 +546,7 @@ st_context_teximage(struct st_context_iface *stctxi,
 | ||||
|     stObj->width0 = width; | ||||
|     stObj->height0 = height; | ||||
|     stObj->depth0 = depth; | ||||
| +   stObj->surface_format = pipe_format;
 | ||||
|   | ||||
|     _mesa_dirty_texobj(ctx, texObj, GL_TRUE); | ||||
|     _mesa_unlock_texture(ctx, texObj); | ||||
| diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h
 | ||||
| index da899c9..c15aeae 100644
 | ||||
| --- a/src/mesa/state_tracker/st_texture.h
 | ||||
| +++ b/src/mesa/state_tracker/st_texture.h
 | ||||
| @@ -87,10 +87,16 @@ struct st_texture_object
 | ||||
|      */ | ||||
|     struct pipe_sampler_view *sampler_view; | ||||
|   | ||||
| -   /* True if there is/was a surface bound to this texture object.  It helps
 | ||||
| -    * track whether the texture object is surface based or not.
 | ||||
| +   /* True if this texture comes from the window system. Such a texture
 | ||||
| +    * cannot be reallocated and the format can only be changed with a sampler
 | ||||
| +    * view or a surface.
 | ||||
|      */ | ||||
|     GLboolean surface_based; | ||||
| +
 | ||||
| +   /* If surface_based is true, this format should be used for all sampler
 | ||||
| +    * views and surfaces instead of pt->format.
 | ||||
| +    */
 | ||||
| +   enum pipe_format surface_format;
 | ||||
|  }; | ||||
|   | ||||
|   | ||||
| -- 
 | ||||
| 1.8.2.1 | ||||
| 
 | ||||
							
								
								
									
										1038
									
								
								0001-swrast-gallium-classic-add-MESA_copy_sub_buffer-supp.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1038
									
								
								0001-swrast-gallium-classic-add-MESA_copy_sub_buffer-supp.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										10
									
								
								mesa.spec
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								mesa.spec
									
									
									
									
									
								
							| @ -54,7 +54,7 @@ | ||||
| Summary: Mesa graphics libraries | ||||
| Name: mesa | ||||
| Version: 10.0 | ||||
| Release: 1.%{gitdate}%{?dist} | ||||
| Release: 2.%{gitdate}%{?dist} | ||||
| License: MIT | ||||
| Group: System Environment/Libraries | ||||
| URL: http://www.mesa3d.org | ||||
| @ -76,6 +76,9 @@ Patch12: mesa-8.0.1-fix-16bpp.patch | ||||
| Patch15: mesa-9.2-hardware-float.patch | ||||
| Patch20: mesa-9.2-evergreen-big-endian.patch | ||||
| 
 | ||||
| # backport from upstream to allow cogl use copy_sub_buffer | ||||
| Patch30: 0001-swrast-gallium-classic-add-MESA_copy_sub_buffer-supp.patch | ||||
| 
 | ||||
| BuildRequires: pkgconfig autoconf automake libtool | ||||
| %if %{with_hardware} | ||||
| BuildRequires: kernel-headers | ||||
| @ -300,6 +303,8 @@ grep -q ^/ src/gallium/auxiliary/vl/vl_decoder.c && exit 1 | ||||
| %patch15 -p1 -b .hwfloat | ||||
| %patch20 -p1 -b .egbe | ||||
| 
 | ||||
| %patch30 -p1 -b .copy_sub_buffer | ||||
| 
 | ||||
| %if 0%{with_private_llvm} | ||||
| sed -i 's/llvm-config/mesa-private-llvm-config-%{__isa_bits}/g' configure.ac | ||||
| sed -i 's/`$LLVM_CONFIG --version`/&-mesa/' configure.ac | ||||
| @ -591,6 +596,9 @@ rm -rf $RPM_BUILD_ROOT | ||||
| %endif | ||||
| 
 | ||||
| %changelog | ||||
| * Fri Dec 13 2013 Dave Airlie <airlied@redhat.com> 10.0-2.20131206 | ||||
| - add software driver copy_sub_buffer support from upstream | ||||
| 
 | ||||
| * Sun Dec 01 2013 Igor Gnatenko <i.gnatenko.brain@gmail.com> - 10.0-1.20131206 | ||||
| - 10.0 upstream (RHBZ 1036361) | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user