[Mesa-dev] [PATCH 1/7] gallium: Constify several pipe_screen get_* functions

Jose Fonseca jfonseca at vmware.com
Tue Jul 16 07:03:29 PDT 2013


----- Original Message -----
> Has anyone had a chance to look at this series?

No, I just noticed this one now.


FWIW, I don't see much value in constifying gallium interfaces:

- interfaces like pipe_screen have no state other that function pointers.

- some drivers might change function pointers on the fly (draw module does this for example)

- some drivers might need do complex things -- imagine a pipe driver that needs to communicate with a remote computer and change a bunch of internal state even for something as basic pipe_screen::get_shader_param -- the screen object might not be constant either

AFAICT, "const" here just imposes a constrain on the implementation of pipe drivers, but without a solid basis for it. So I'd prefer leave it alone.


The other two gallium interface changes in the series (endianess and alignment cap) look alright AFAICT.


Jose


> 
> -Tom
> 
> On Tue, Jul 09, 2013 at 09:21:38PM -0700, Tom Stellard wrote:
> > From: Tom Stellard <thomas.stellard at amd.com>
> > 
> > This patches adds the const qualifier to the struct pipe_screen *
> > argument to the following functions:
> > 
> > pipe_screen::get_name()
> > pipe_screen::get_vendor()
> > pipe_screen::get_param()
> > pipe_screen::get_paramf()
> > pipe_screen::get_shader_param()
> > pipe_screen::get_video_param()
> > pipe_screen::get_compute_param()
> > ---
> >  src/gallium/auxiliary/vl/vl_decoder.c             |  3 ++-
> >  src/gallium/auxiliary/vl/vl_decoder.h             |  3 ++-
> >  src/gallium/auxiliary/vl/vl_video_buffer.c        |  2 +-
> >  src/gallium/auxiliary/vl/vl_video_buffer.h        |  2 +-
> >  src/gallium/drivers/freedreno/freedreno_screen.c  | 12 +++++-----
> >  src/gallium/drivers/freedreno/freedreno_screen.h  |  6 +++++
> >  src/gallium/drivers/galahad/glhd_screen.c         | 20 ++++++++--------
> >  src/gallium/drivers/galahad/glhd_screen.h         |  7 ++++++
> >  src/gallium/drivers/i915/i915_screen.c            | 14 ++++++------
> >  src/gallium/drivers/i915/i915_screen.h            |  6 +++++
> >  src/gallium/drivers/identity/id_screen.c          | 20 ++++++++--------
> >  src/gallium/drivers/identity/id_screen.h          |  6 +++++
> >  src/gallium/drivers/ilo/ilo_screen.c              | 18 +++++++--------
> >  src/gallium/drivers/ilo/ilo_screen.h              |  6 +++++
> >  src/gallium/drivers/llvmpipe/lp_screen.c          | 10 ++++----
> >  src/gallium/drivers/noop/noop_pipe.c              | 10 ++++----
> >  src/gallium/drivers/nouveau/nouveau_screen.c      |  6 ++---
> >  src/gallium/drivers/nouveau/nouveau_screen.h      |  6 +++++
> >  src/gallium/drivers/nouveau/nouveau_video.c       |  2 +-
> >  src/gallium/drivers/nv30/nv30_screen.c            | 12 +++++-----
> >  src/gallium/drivers/nv30/nv30_screen.h            |  6 +++++
> >  src/gallium/drivers/nv50/nv50_screen.c            | 14 ++++++------
> >  src/gallium/drivers/nv50/nv50_screen.h            |  6 +++++
> >  src/gallium/drivers/nvc0/nvc0_context.h           |  2 +-
> >  src/gallium/drivers/nvc0/nvc0_screen.c            | 14 ++++++------
> >  src/gallium/drivers/nvc0/nvc0_screen.h            |  7 ++++++
> >  src/gallium/drivers/nvc0/nvc0_video.c             |  4 ++--
> >  src/gallium/drivers/r300/r300_screen.c            | 20 ++++++++--------
> >  src/gallium/drivers/r300/r300_screen.h            |  5 ++++
> >  src/gallium/drivers/r600/r600_pipe.c              | 16 ++++++-------
> >  src/gallium/drivers/r600/r600_pipe.h              |  2 +-
> >  src/gallium/drivers/r600/r600_uvd.c               |  2 +-
> >  src/gallium/drivers/radeon/radeon_uvd.c           |  2 +-
> >  src/gallium/drivers/radeon/radeon_uvd.h           |  2 +-
> >  src/gallium/drivers/radeonsi/radeonsi_pipe.c      | 20 ++++++++--------
> >  src/gallium/drivers/rbug/rbug_screen.c            | 20 ++++++++--------
> >  src/gallium/drivers/rbug/rbug_screen.h            |  7 ++++++
> >  src/gallium/drivers/softpipe/sp_screen.c          | 14 ++++++------
> >  src/gallium/drivers/softpipe/sp_screen.h          |  5 ++++
> >  src/gallium/drivers/svga/svga_screen.c            | 24 ++++++++++++-------
> >  src/gallium/drivers/svga/svga_screen.h            |  9 ++++++++
> >  src/gallium/drivers/trace/tr_screen.c             | 28
> >  +++++++++++++++--------
> >  src/gallium/drivers/trace/tr_screen.h             |  2 ++
> >  src/gallium/include/pipe/p_screen.h               | 14 ++++++------
> >  src/gallium/state_trackers/clover/core/device.hpp |  1 +
> >  45 files changed, 260 insertions(+), 157 deletions(-)
> > 
> > diff --git a/src/gallium/auxiliary/vl/vl_decoder.c
> > b/src/gallium/auxiliary/vl/vl_decoder.c
> > index d6909cb..386bee9 100644
> > --- a/src/gallium/auxiliary/vl/vl_decoder.c
> > +++ b/src/gallium/auxiliary/vl/vl_decoder.c
> > @@ -33,7 +33,8 @@
> >  #include "vl_mpeg12_decoder.h"
> >  
> >  bool
> > -vl_profile_supported(struct pipe_screen *screen, enum pipe_video_profile
> > profile)
> > +vl_profile_supported(const struct pipe_screen *screen,
> > +                     enum pipe_video_profile profile)
> >  {
> >     assert(screen);
> >     switch (u_reduce_video_profile(profile)) {
> > diff --git a/src/gallium/auxiliary/vl/vl_decoder.h
> > b/src/gallium/auxiliary/vl/vl_decoder.h
> > index 8fa6527..8ebf762 100644
> > --- a/src/gallium/auxiliary/vl/vl_decoder.h
> > +++ b/src/gallium/auxiliary/vl/vl_decoder.h
> > @@ -35,7 +35,8 @@
> >   * check if a given profile is supported with shader based decoding
> >   */
> >  bool
> > -vl_profile_supported(struct pipe_screen *screen, enum pipe_video_profile
> > profile);
> > +vl_profile_supported(const struct pipe_screen *screen,
> > +                     enum pipe_video_profile profile);
> >  
> >  /**
> >   * standard implementation of pipe->create_video_decoder
> > diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.c
> > b/src/gallium/auxiliary/vl/vl_video_buffer.c
> > index 6ef95e4..4dd2c49 100644
> > --- a/src/gallium/auxiliary/vl/vl_video_buffer.c
> > +++ b/src/gallium/auxiliary/vl/vl_video_buffer.c
> > @@ -175,7 +175,7 @@ vl_video_buffer_is_format_supported(struct pipe_screen
> > *screen,
> >  }
> >  
> >  unsigned
> > -vl_video_buffer_max_size(struct pipe_screen *screen)
> > +vl_video_buffer_max_size(const struct pipe_screen *screen)
> >  {
> >     uint32_t max_2d_texture_level;
> >  
> > diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.h
> > b/src/gallium/auxiliary/vl/vl_video_buffer.h
> > index 178f429..9d192b2 100644
> > --- a/src/gallium/auxiliary/vl/vl_video_buffer.h
> > +++ b/src/gallium/auxiliary/vl/vl_video_buffer.h
> > @@ -64,7 +64,7 @@ vl_video_buffer_plane_order(enum pipe_format format);
> >   * get maximum size of video buffers
> >   */
> >  unsigned
> > -vl_video_buffer_max_size(struct pipe_screen *screen);
> > +vl_video_buffer_max_size(const struct pipe_screen *screen);
> >  
> >  /**
> >   * check if video buffer format is supported for a codec/profile
> > diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c
> > b/src/gallium/drivers/freedreno/freedreno_screen.c
> > index ff45b3e..372f87d 100644
> > --- a/src/gallium/drivers/freedreno/freedreno_screen.c
> > +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
> > @@ -68,16 +68,16 @@ DEBUG_GET_ONCE_FLAGS_OPTION(fd_mesa_debug,
> > "FD_MESA_DEBUG", debug_options, 0)
> >  int fd_mesa_debug = 0;
> >  
> >  static const char *
> > -fd_screen_get_name(struct pipe_screen *pscreen)
> > +fd_screen_get_name(const struct pipe_screen *pscreen)
> >  {
> >  	static char buffer[128];
> >  	util_snprintf(buffer, sizeof(buffer), "FD%03d",
> > -			fd_screen(pscreen)->device_id);
> > +			fd_screen_const(pscreen)->device_id);
> >  	return buffer;
> >  }
> >  
> >  static const char *
> > -fd_screen_get_vendor(struct pipe_screen *pscreen)
> > +fd_screen_get_vendor(const struct pipe_screen *pscreen)
> >  {
> >  	return "freedreno";
> >  }
> > @@ -131,7 +131,7 @@ TODO either move caps to a2xx/a3xx specific code, or
> > maybe have some
> >  tables for things that differ if the delta is not too much..
> >   */
> >  static int
> > -fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
> > +fd_screen_get_param(const struct pipe_screen *pscreen, enum pipe_cap
> > param)
> >  {
> >  	/* this is probably not totally correct.. but it's a start: */
> >  	switch (param) {
> > @@ -234,7 +234,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum
> > pipe_cap param)
> >  }
> >  
> >  static float
> > -fd_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
> > +fd_screen_get_paramf(const struct pipe_screen *pscreen, enum pipe_capf
> > param)
> >  {
> >  	switch (param) {
> >  	case PIPE_CAPF_MAX_LINE_WIDTH:
> > @@ -258,7 +258,7 @@ fd_screen_get_paramf(struct pipe_screen *pscreen, enum
> > pipe_capf param)
> >  }
> >  
> >  static int
> > -fd_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
> > +fd_screen_get_shader_param(const struct pipe_screen *pscreen, unsigned
> > shader,
> >  		enum pipe_shader_cap param)
> >  {
> >  	switch(shader)
> > diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h
> > b/src/gallium/drivers/freedreno/freedreno_screen.h
> > index 93501e7..1d63b5a 100644
> > --- a/src/gallium/drivers/freedreno/freedreno_screen.h
> > +++ b/src/gallium/drivers/freedreno/freedreno_screen.h
> > @@ -58,6 +58,12 @@ fd_screen(struct pipe_screen *pscreen)
> >  	return (struct fd_screen *)pscreen;
> >  }
> >  
> > +static INLINE const struct fd_screen *
> > +fd_screen_const(const struct pipe_screen *pscreen)
> > +{
> > +	return (const struct fd_screen *)pscreen;
> > +}
> > +
> >  boolean fd_screen_bo_get_handle(struct pipe_screen *pscreen,
> >  		struct fd_bo *bo,
> >  		unsigned stride,
> > diff --git a/src/gallium/drivers/galahad/glhd_screen.c
> > b/src/gallium/drivers/galahad/glhd_screen.c
> > index 16a5ff1..0d1aace 100644
> > --- a/src/gallium/drivers/galahad/glhd_screen.c
> > +++ b/src/gallium/drivers/galahad/glhd_screen.c
> > @@ -52,28 +52,28 @@ galahad_screen_destroy(struct pipe_screen *_screen)
> >  }
> >  
> >  static const char *
> > -galahad_screen_get_name(struct pipe_screen *_screen)
> > +galahad_screen_get_name(const struct pipe_screen *_screen)
> >  {
> > -   struct galahad_screen *glhd_screen = galahad_screen(_screen);
> > +   const struct galahad_screen *glhd_screen =
> > galahad_screen_const(_screen);
> >     struct pipe_screen *screen = glhd_screen->screen;
> >  
> >     return screen->get_name(screen);
> >  }
> >  
> >  static const char *
> > -galahad_screen_get_vendor(struct pipe_screen *_screen)
> > +galahad_screen_get_vendor(const struct pipe_screen *_screen)
> >  {
> > -   struct galahad_screen *glhd_screen = galahad_screen(_screen);
> > +   const struct galahad_screen *glhd_screen =
> > galahad_screen_const(_screen);
> >     struct pipe_screen *screen = glhd_screen->screen;
> >  
> >     return screen->get_vendor(screen);
> >  }
> >  
> >  static int
> > -galahad_screen_get_param(struct pipe_screen *_screen,
> > +galahad_screen_get_param(const struct pipe_screen *_screen,
> >                            enum pipe_cap param)
> >  {
> > -   struct galahad_screen *glhd_screen = galahad_screen(_screen);
> > +   const struct galahad_screen *glhd_screen =
> > galahad_screen_const(_screen);
> >     struct pipe_screen *screen = glhd_screen->screen;
> >  
> >     return screen->get_param(screen,
> > @@ -81,10 +81,10 @@ galahad_screen_get_param(struct pipe_screen *_screen,
> >  }
> >  
> >  static int
> > -galahad_screen_get_shader_param(struct pipe_screen *_screen,
> > +galahad_screen_get_shader_param(const struct pipe_screen *_screen,
> >                            unsigned shader, enum pipe_shader_cap param)
> >  {
> > -   struct galahad_screen *glhd_screen = galahad_screen(_screen);
> > +   const struct galahad_screen *glhd_screen =
> > galahad_screen_const(_screen);
> >     struct pipe_screen *screen = glhd_screen->screen;
> >  
> >     return screen->get_shader_param(screen, shader,
> > @@ -92,10 +92,10 @@ galahad_screen_get_shader_param(struct pipe_screen
> > *_screen,
> >  }
> >  
> >  static float
> > -galahad_screen_get_paramf(struct pipe_screen *_screen,
> > +galahad_screen_get_paramf(const struct pipe_screen *_screen,
> >                             enum pipe_capf param)
> >  {
> > -   struct galahad_screen *glhd_screen = galahad_screen(_screen);
> > +   const struct galahad_screen *glhd_screen =
> > galahad_screen_const(_screen);
> >     struct pipe_screen *screen = glhd_screen->screen;
> >  
> >     return screen->get_paramf(screen,
> > diff --git a/src/gallium/drivers/galahad/glhd_screen.h
> > b/src/gallium/drivers/galahad/glhd_screen.h
> > index 7862f4a..8b4ff03 100644
> > --- a/src/gallium/drivers/galahad/glhd_screen.h
> > +++ b/src/gallium/drivers/galahad/glhd_screen.h
> > @@ -45,4 +45,11 @@ galahad_screen(struct pipe_screen *screen)
> >     return (struct galahad_screen *)screen;
> >  }
> >  
> > +static INLINE const struct galahad_screen *
> > +galahad_screen_const(const struct pipe_screen *screen)
> > +{
> > +   return (const struct galahad_screen *)screen;
> > +}
> > +
> > +
> >  #endif /* GLHD_SCREEN_H */
> > diff --git a/src/gallium/drivers/i915/i915_screen.c
> > b/src/gallium/drivers/i915/i915_screen.c
> > index 3c751c5..9139644 100644
> > --- a/src/gallium/drivers/i915/i915_screen.c
> > +++ b/src/gallium/drivers/i915/i915_screen.c
> > @@ -48,18 +48,18 @@
> >  
> >  
> >  static const char *
> > -i915_get_vendor(struct pipe_screen *screen)
> > +i915_get_vendor(const struct pipe_screen *screen)
> >  {
> >     return "VMware, Inc.";
> >  }
> >  
> >  static const char *
> > -i915_get_name(struct pipe_screen *screen)
> > +i915_get_name(const struct pipe_screen *screen)
> >  {
> >     static char buffer[128];
> >     const char *chipset;
> >  
> > -   switch (i915_screen(screen)->iws->pci_id) {
> > +   switch (i915_screen_const(screen)->iws->pci_id) {
> >     case PCI_CHIP_I915_G:
> >        chipset = "915G";
> >        break;
> > @@ -100,7 +100,7 @@ i915_get_name(struct pipe_screen *screen)
> >  }
> >  
> >  static int
> > -i915_get_shader_param(struct pipe_screen *screen, unsigned shader, enum
> > pipe_shader_cap cap)
> > +i915_get_shader_param(const struct pipe_screen *screen, unsigned shader,
> > enum pipe_shader_cap cap)
> >  {
> >     switch(shader) {
> >     case PIPE_SHADER_VERTEX:
> > @@ -164,9 +164,9 @@ i915_get_shader_param(struct pipe_screen *screen,
> > unsigned shader, enum pipe_sha
> >  }
> >  
> >  static int
> > -i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
> > +i915_get_param(const struct pipe_screen *screen, enum pipe_cap cap)
> >  {
> > -   struct i915_screen *is = i915_screen(screen);
> > +   const struct i915_screen *is = i915_screen_const(screen);
> >  
> >     switch (cap) {
> >     /* Supported features (boolean caps). */
> > @@ -271,7 +271,7 @@ i915_get_param(struct pipe_screen *screen, enum
> > pipe_cap cap)
> >  }
> >  
> >  static float
> > -i915_get_paramf(struct pipe_screen *screen, enum pipe_capf cap)
> > +i915_get_paramf(const struct pipe_screen *screen, enum pipe_capf cap)
> >  {
> >     switch(cap) {
> >     case PIPE_CAPF_MAX_LINE_WIDTH:
> > diff --git a/src/gallium/drivers/i915/i915_screen.h
> > b/src/gallium/drivers/i915/i915_screen.h
> > index 9f2004e..89eabe5 100644
> > --- a/src/gallium/drivers/i915/i915_screen.h
> > +++ b/src/gallium/drivers/i915/i915_screen.h
> > @@ -65,6 +65,12 @@ i915_screen(struct pipe_screen *pscreen)
> >     return (struct i915_screen *) pscreen;
> >  }
> >  
> > +static INLINE const struct i915_screen *
> > +i915_screen_const(const struct pipe_screen *pscreen)
> > +{
> > +   return (const struct i915_screen *) pscreen;
> > +}
> > +
> >  boolean
> >  i915_is_format_supported(struct pipe_screen *screen,
> >                           enum pipe_format format,
> > diff --git a/src/gallium/drivers/identity/id_screen.c
> > b/src/gallium/drivers/identity/id_screen.c
> > index 26df7f6..884d195 100644
> > --- a/src/gallium/drivers/identity/id_screen.c
> > +++ b/src/gallium/drivers/identity/id_screen.c
> > @@ -48,28 +48,28 @@ identity_screen_destroy(struct pipe_screen *_screen)
> >  }
> >  
> >  static const char *
> > -identity_screen_get_name(struct pipe_screen *_screen)
> > +identity_screen_get_name(const struct pipe_screen *_screen)
> >  {
> > -   struct identity_screen *id_screen = identity_screen(_screen);
> > +   const struct identity_screen *id_screen =
> > identity_screen_const(_screen);
> >     struct pipe_screen *screen = id_screen->screen;
> >  
> >     return screen->get_name(screen);
> >  }
> >  
> >  static const char *
> > -identity_screen_get_vendor(struct pipe_screen *_screen)
> > +identity_screen_get_vendor(const struct pipe_screen *_screen)
> >  {
> > -   struct identity_screen *id_screen = identity_screen(_screen);
> > +   const struct identity_screen *id_screen =
> > identity_screen_const(_screen);
> >     struct pipe_screen *screen = id_screen->screen;
> >  
> >     return screen->get_vendor(screen);
> >  }
> >  
> >  static int
> > -identity_screen_get_param(struct pipe_screen *_screen,
> > +identity_screen_get_param(const struct pipe_screen *_screen,
> >                            enum pipe_cap param)
> >  {
> > -   struct identity_screen *id_screen = identity_screen(_screen);
> > +   const struct identity_screen *id_screen =
> > identity_screen_const(_screen);
> >     struct pipe_screen *screen = id_screen->screen;
> >  
> >     return screen->get_param(screen,
> > @@ -77,10 +77,10 @@ identity_screen_get_param(struct pipe_screen *_screen,
> >  }
> >  
> >  static int
> > -identity_screen_get_shader_param(struct pipe_screen *_screen,
> > +identity_screen_get_shader_param(const struct pipe_screen *_screen,
> >                            unsigned shader, enum pipe_shader_cap param)
> >  {
> > -   struct identity_screen *id_screen = identity_screen(_screen);
> > +   const struct identity_screen *id_screen =
> > identity_screen_const(_screen);
> >     struct pipe_screen *screen = id_screen->screen;
> >  
> >     return screen->get_shader_param(screen, shader,
> > @@ -88,10 +88,10 @@ identity_screen_get_shader_param(struct pipe_screen
> > *_screen,
> >  }
> >  
> >  static float
> > -identity_screen_get_paramf(struct pipe_screen *_screen,
> > +identity_screen_get_paramf(const struct pipe_screen *_screen,
> >                             enum pipe_capf param)
> >  {
> > -   struct identity_screen *id_screen = identity_screen(_screen);
> > +   const struct identity_screen *id_screen =
> > identity_screen_const(_screen);
> >     struct pipe_screen *screen = id_screen->screen;
> >  
> >     return screen->get_paramf(screen,
> > diff --git a/src/gallium/drivers/identity/id_screen.h
> > b/src/gallium/drivers/identity/id_screen.h
> > index 2c4f129..3fbca36 100644
> > --- a/src/gallium/drivers/identity/id_screen.h
> > +++ b/src/gallium/drivers/identity/id_screen.h
> > @@ -45,4 +45,10 @@ identity_screen(struct pipe_screen *screen)
> >     return (struct identity_screen *)screen;
> >  }
> >  
> > +static INLINE const struct identity_screen *
> > +identity_screen_const(const struct pipe_screen *screen)
> > +{
> > +   return (const struct identity_screen *)screen;
> > +}
> > +
> >  #endif /* ID_SCREEN_H */
> > diff --git a/src/gallium/drivers/ilo/ilo_screen.c
> > b/src/gallium/drivers/ilo/ilo_screen.c
> > index 1e3d096..7b78cca 100644
> > --- a/src/gallium/drivers/ilo/ilo_screen.c
> > +++ b/src/gallium/drivers/ilo/ilo_screen.c
> > @@ -52,7 +52,7 @@ static const struct debug_named_value ilo_debug_flags[] =
> > {
> >  };
> >  
> >  static float
> > -ilo_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
> > +ilo_get_paramf(const struct pipe_screen *screen, enum pipe_capf param)
> >  {
> >     switch (param) {
> >     case PIPE_CAPF_MAX_LINE_WIDTH:
> > @@ -86,7 +86,7 @@ ilo_get_paramf(struct pipe_screen *screen, enum pipe_capf
> > param)
> >  }
> >  
> >  static int
> > -ilo_get_shader_param(struct pipe_screen *screen, unsigned shader,
> > +ilo_get_shader_param(const struct pipe_screen *screen, unsigned shader,
> >                       enum pipe_shader_cap param)
> >  {
> >     switch (shader) {
> > @@ -150,7 +150,7 @@ ilo_get_shader_param(struct pipe_screen *screen,
> > unsigned shader,
> >  }
> >  
> >  static int
> > -ilo_get_video_param(struct pipe_screen *screen,
> > +ilo_get_video_param(const struct pipe_screen *screen,
> >                      enum pipe_video_profile profile,
> >                      enum pipe_video_cap param)
> >  {
> > @@ -177,7 +177,7 @@ ilo_get_video_param(struct pipe_screen *screen,
> >  }
> >  
> >  static int
> > -ilo_get_compute_param(struct pipe_screen *screen,
> > +ilo_get_compute_param(const struct pipe_screen *screen,
> >                        enum pipe_compute_cap param,
> >                        void *ret)
> >  {
> > @@ -276,9 +276,9 @@ ilo_get_compute_param(struct pipe_screen *screen,
> >  }
> >  
> >  static int
> > -ilo_get_param(struct pipe_screen *screen, enum pipe_cap param)
> > +ilo_get_param(const struct pipe_screen *screen, enum pipe_cap param)
> >  {
> > -   struct ilo_screen *is = ilo_screen(screen);
> > +   const struct ilo_screen *is = ilo_screen_const(screen);
> >  
> >     switch (param) {
> >     case PIPE_CAP_NPOT_TEXTURES:
> > @@ -427,15 +427,15 @@ ilo_get_param(struct pipe_screen *screen, enum
> > pipe_cap param)
> >  }
> >  
> >  static const char *
> > -ilo_get_vendor(struct pipe_screen *screen)
> > +ilo_get_vendor(const struct pipe_screen *screen)
> >  {
> >     return "LunarG, Inc.";
> >  }
> >  
> >  static const char *
> > -ilo_get_name(struct pipe_screen *screen)
> > +ilo_get_name(const struct pipe_screen *screen)
> >  {
> > -   struct ilo_screen *is = ilo_screen(screen);
> > +   const struct ilo_screen *is = ilo_screen_const(screen);
> >     const char *chipset;
> >  
> >     /* stolen from classic i965 */
> > diff --git a/src/gallium/drivers/ilo/ilo_screen.h
> > b/src/gallium/drivers/ilo/ilo_screen.h
> > index 4c403f0..37f63a0 100644
> > --- a/src/gallium/drivers/ilo/ilo_screen.h
> > +++ b/src/gallium/drivers/ilo/ilo_screen.h
> > @@ -54,6 +54,12 @@ ilo_screen(struct pipe_screen *screen)
> >     return (struct ilo_screen *) screen;
> >  }
> >  
> > +static inline const struct ilo_screen *
> > +ilo_screen_const(const struct pipe_screen *screen)
> > +{
> > +   return (struct ilo_screen *) screen;
> > +}
> > +
> >  static inline struct ilo_fence *
> >  ilo_fence(struct pipe_fence_handle *fence)
> >  {
> > diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c
> > b/src/gallium/drivers/llvmpipe/lp_screen.c
> > index 1fed537..4b77222 100644
> > --- a/src/gallium/drivers/llvmpipe/lp_screen.c
> > +++ b/src/gallium/drivers/llvmpipe/lp_screen.c
> > @@ -85,14 +85,14 @@ static const struct debug_named_value lp_perf_flags[] =
> > {
> >  
> >  
> >  static const char *
> > -llvmpipe_get_vendor(struct pipe_screen *screen)
> > +llvmpipe_get_vendor(const struct pipe_screen *screen)
> >  {
> >     return "VMware, Inc.";
> >  }
> >  
> >  
> >  static const char *
> > -llvmpipe_get_name(struct pipe_screen *screen)
> > +llvmpipe_get_name(const struct pipe_screen *screen)
> >  {
> >     static char buf[100];
> >     util_snprintf(buf, sizeof(buf), "llvmpipe (LLVM %u.%u, %u bits)",
> > @@ -103,7 +103,7 @@ llvmpipe_get_name(struct pipe_screen *screen)
> >  
> >  
> >  static int
> > -llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
> > +llvmpipe_get_param(const struct pipe_screen *screen, enum pipe_cap param)
> >  {
> >     switch (param) {
> >     case PIPE_CAP_MAX_COMBINED_SAMPLERS:
> > @@ -238,7 +238,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum
> > pipe_cap param)
> >  }
> >  
> >  static int
> > -llvmpipe_get_shader_param(struct pipe_screen *screen, unsigned shader,
> > enum pipe_shader_cap param)
> > +llvmpipe_get_shader_param(const struct pipe_screen *screen, unsigned
> > shader, enum pipe_shader_cap param)
> >  {
> >     switch(shader)
> >     {
> > @@ -268,7 +268,7 @@ llvmpipe_get_shader_param(struct pipe_screen *screen,
> > unsigned shader, enum pipe
> >  }
> >  
> >  static float
> > -llvmpipe_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
> > +llvmpipe_get_paramf(const struct pipe_screen *screen, enum pipe_capf
> > param)
> >  {
> >     switch (param) {
> >     case PIPE_CAPF_MAX_LINE_WIDTH:
> > diff --git a/src/gallium/drivers/noop/noop_pipe.c
> > b/src/gallium/drivers/noop/noop_pipe.c
> > index ac837b1..cedf8b0 100644
> > --- a/src/gallium/drivers/noop/noop_pipe.c
> > +++ b/src/gallium/drivers/noop/noop_pipe.c
> > @@ -292,24 +292,24 @@ static void noop_flush_frontbuffer(struct pipe_screen
> > *_screen,
> >  {
> >  }
> >  
> > -static const char *noop_get_vendor(struct pipe_screen* pscreen)
> > +static const char *noop_get_vendor(const struct pipe_screen* pscreen)
> >  {
> >  	return "X.Org";
> >  }
> >  
> > -static const char *noop_get_name(struct pipe_screen* pscreen)
> > +static const char *noop_get_name(const struct pipe_screen* pscreen)
> >  {
> >  	return "NOOP";
> >  }
> >  
> > -static int noop_get_param(struct pipe_screen* pscreen, enum pipe_cap
> > param)
> > +static int noop_get_param(const struct pipe_screen* pscreen, enum pipe_cap
> > param)
> >  {
> >  	struct pipe_screen *screen = ((struct
> >  	noop_pipe_screen*)pscreen)->oscreen;
> >  
> >  	return screen->get_param(screen, param);
> >  }
> >  
> > -static float noop_get_paramf(struct pipe_screen* pscreen,
> > +static float noop_get_paramf(const struct pipe_screen* pscreen,
> >  			     enum pipe_capf param)
> >  {
> >  	struct pipe_screen *screen = ((struct
> >  	noop_pipe_screen*)pscreen)->oscreen;
> > @@ -317,7 +317,7 @@ static float noop_get_paramf(struct pipe_screen*
> > pscreen,
> >  	return screen->get_paramf(screen, param);
> >  }
> >  
> > -static int noop_get_shader_param(struct pipe_screen* pscreen, unsigned
> > shader, enum pipe_shader_cap param)
> > +static int noop_get_shader_param(const struct pipe_screen* pscreen,
> > unsigned shader, enum pipe_shader_cap param)
> >  {
> >  	struct pipe_screen *screen = ((struct
> >  	noop_pipe_screen*)pscreen)->oscreen;
> >  
> > diff --git a/src/gallium/drivers/nouveau/nouveau_screen.c
> > b/src/gallium/drivers/nouveau/nouveau_screen.c
> > index d129a55..d380b86 100644
> > --- a/src/gallium/drivers/nouveau/nouveau_screen.c
> > +++ b/src/gallium/drivers/nouveau/nouveau_screen.c
> > @@ -28,9 +28,9 @@
> >  int nouveau_mesa_debug = 0;
> >  
> >  static const char *
> > -nouveau_screen_get_name(struct pipe_screen *pscreen)
> > +nouveau_screen_get_name(const struct pipe_screen *pscreen)
> >  {
> > -	struct nouveau_device *dev = nouveau_screen(pscreen)->device;
> > +	struct nouveau_device *dev = nouveau_screen_const(pscreen)->device;
> >  	static char buffer[128];
> >  
> >  	util_snprintf(buffer, sizeof(buffer), "NV%02X", dev->chipset);
> > @@ -38,7 +38,7 @@ nouveau_screen_get_name(struct pipe_screen *pscreen)
> >  }
> >  
> >  static const char *
> > -nouveau_screen_get_vendor(struct pipe_screen *pscreen)
> > +nouveau_screen_get_vendor(const struct pipe_screen *pscreen)
> >  {
> >  	return "nouveau";
> >  }
> > diff --git a/src/gallium/drivers/nouveau/nouveau_screen.h
> > b/src/gallium/drivers/nouveau/nouveau_screen.h
> > index 7f15d10..e941450 100644
> > --- a/src/gallium/drivers/nouveau/nouveau_screen.h
> > +++ b/src/gallium/drivers/nouveau/nouveau_screen.h
> > @@ -107,6 +107,12 @@ nouveau_screen(struct pipe_screen *pscreen)
> >  	return (struct nouveau_screen *)pscreen;
> >  }
> >  
> > +static INLINE const struct nouveau_screen *
> > +nouveau_screen_const(const struct pipe_screen *pscreen)
> > +{
> > +	return (const struct nouveau_screen *)pscreen;
> > +}
> > +
> >  boolean
> >  nouveau_screen_bo_get_handle(struct pipe_screen *pscreen,
> >  			     struct nouveau_bo *bo,
> > diff --git a/src/gallium/drivers/nouveau/nouveau_video.c
> > b/src/gallium/drivers/nouveau/nouveau_video.c
> > index 9357508..69efcfd 100644
> > --- a/src/gallium/drivers/nouveau/nouveau_video.c
> > +++ b/src/gallium/drivers/nouveau/nouveau_video.c
> > @@ -842,7 +842,7 @@ error:
> >  }
> >  
> >  static int
> > -nouveau_screen_get_video_param(struct pipe_screen *pscreen,
> > +nouveau_screen_get_video_param(const struct pipe_screen *pscreen,
> >                                 enum pipe_video_profile profile,
> >                                 enum pipe_video_cap param)
> >  {
> > diff --git a/src/gallium/drivers/nv30/nv30_screen.c
> > b/src/gallium/drivers/nv30/nv30_screen.c
> > index 07ffc80..3d173d5 100644
> > --- a/src/gallium/drivers/nv30/nv30_screen.c
> > +++ b/src/gallium/drivers/nv30/nv30_screen.c
> > @@ -45,9 +45,9 @@
> >  #define CURIE_4497_CHIPSET6X 0x00000088
> >  
> >  static int
> > -nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
> > +nv30_screen_get_param(const struct pipe_screen *pscreen, enum pipe_cap
> > param)
> >  {
> > -   struct nv30_screen *screen = nv30_screen(pscreen);
> > +   const struct nv30_screen *screen = nv30_screen_const(pscreen);
> >     struct nouveau_object *eng3d = screen->eng3d;
> >  
> >     switch (param) {
> > @@ -137,9 +137,9 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum
> > pipe_cap param)
> >  }
> >  
> >  static float
> > -nv30_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
> > +nv30_screen_get_paramf(const struct pipe_screen *pscreen, enum pipe_capf
> > param)
> >  {
> > -   struct nv30_screen *screen = nv30_screen(pscreen);
> > +   const struct nv30_screen *screen = nv30_screen_const(pscreen);
> >     struct nouveau_object *eng3d = screen->eng3d;
> >  
> >     switch (param) {
> > @@ -160,10 +160,10 @@ nv30_screen_get_paramf(struct pipe_screen *pscreen,
> > enum pipe_capf param)
> >  }
> >  
> >  static int
> > -nv30_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
> > +nv30_screen_get_shader_param(const struct pipe_screen *pscreen, unsigned
> > shader,
> >                               enum pipe_shader_cap param)
> >  {
> > -   struct nv30_screen *screen = nv30_screen(pscreen);
> > +   const struct nv30_screen *screen = nv30_screen_const(pscreen);
> >     struct nouveau_object *eng3d = screen->eng3d;
> >  
> >     switch (shader) {
> > diff --git a/src/gallium/drivers/nv30/nv30_screen.h
> > b/src/gallium/drivers/nv30/nv30_screen.h
> > index 2ee087e..663acfe 100644
> > --- a/src/gallium/drivers/nv30/nv30_screen.h
> > +++ b/src/gallium/drivers/nv30/nv30_screen.h
> > @@ -48,4 +48,10 @@ nv30_screen(struct pipe_screen *pscreen)
> >     return (struct nv30_screen *)pscreen;
> >  }
> >  
> > +static INLINE const struct nv30_screen *
> > +nv30_screen_const(const struct pipe_screen *pscreen)
> > +{
> > +   return (const struct nv30_screen *)pscreen;
> > +}
> > +
> >  #endif
> > diff --git a/src/gallium/drivers/nv50/nv50_screen.c
> > b/src/gallium/drivers/nv50/nv50_screen.c
> > index 5c57aa2..5ccf1b7 100644
> > --- a/src/gallium/drivers/nv50/nv50_screen.c
> > +++ b/src/gallium/drivers/nv50/nv50_screen.c
> > @@ -78,9 +78,9 @@ nv50_screen_is_format_supported(struct pipe_screen
> > *pscreen,
> >  }
> >  
> >  static int
> > -nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
> > +nv50_screen_get_param(const struct pipe_screen *pscreen, enum pipe_cap
> > param)
> >  {
> > -   const uint16_t class_3d = nouveau_screen(pscreen)->class_3d;
> > +   const uint16_t class_3d = nouveau_screen_const(pscreen)->class_3d;
> >  
> >     switch (param) {
> >     case PIPE_CAP_MAX_COMBINED_SAMPLERS:
> > @@ -108,7 +108,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum
> > pipe_cap param)
> >     case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
> >        return 65536;
> >     case PIPE_CAP_SEAMLESS_CUBE_MAP:
> > -      return nv50_screen(pscreen)->tesla->oclass >= NVA0_3D_CLASS;
> > +      return nv50_screen_const(pscreen)->tesla->oclass >= NVA0_3D_CLASS;
> >     case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
> >        return 0;
> >     case PIPE_CAP_CUBE_MAP_ARRAY:
> > @@ -147,7 +147,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum
> > pipe_cap param)
> >     case PIPE_CAP_INDEP_BLEND_ENABLE:
> >        return 1;
> >     case PIPE_CAP_INDEP_BLEND_FUNC:
> > -      return nv50_screen(pscreen)->tesla->oclass >= NVA3_3D_CLASS;
> > +      return nv50_screen_const(pscreen)->tesla->oclass >= NVA3_3D_CLASS;
> >     case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
> >     case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
> >        return 1;
> > @@ -196,7 +196,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum
> > pipe_cap param)
> >  }
> >  
> >  static int
> > -nv50_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
> > +nv50_screen_get_shader_param(const struct pipe_screen *pscreen, unsigned
> > shader,
> >                               enum pipe_shader_cap param)
> >  {
> >     switch (shader) {
> > @@ -235,7 +235,7 @@ nv50_screen_get_shader_param(struct pipe_screen
> > *pscreen, unsigned shader,
> >     case PIPE_SHADER_CAP_MAX_PREDS:
> >        return 0;
> >     case PIPE_SHADER_CAP_MAX_TEMPS:
> > -      return nv50_screen(pscreen)->max_tls_space / ONE_TEMP_SIZE;
> > +      return nv50_screen_const(pscreen)->max_tls_space / ONE_TEMP_SIZE;
> >     case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
> >        return 1;
> >     case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
> > @@ -253,7 +253,7 @@ nv50_screen_get_shader_param(struct pipe_screen
> > *pscreen, unsigned shader,
> >  }
> >  
> >  static float
> > -nv50_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
> > +nv50_screen_get_paramf(const struct pipe_screen *pscreen, enum pipe_capf
> > param)
> >  {
> >     switch (param) {
> >     case PIPE_CAPF_MAX_LINE_WIDTH:
> > diff --git a/src/gallium/drivers/nv50/nv50_screen.h
> > b/src/gallium/drivers/nv50/nv50_screen.h
> > index 2e8af43..bb99854 100644
> > --- a/src/gallium/drivers/nv50/nv50_screen.h
> > +++ b/src/gallium/drivers/nv50/nv50_screen.h
> > @@ -75,6 +75,12 @@ nv50_screen(struct pipe_screen *screen)
> >     return (struct nv50_screen *)screen;
> >  }
> >  
> > +static INLINE const struct nv50_screen *
> > +nv50_screen_const(const struct pipe_screen *screen)
> > +{
> > +   return (const struct nv50_screen *)screen;
> > +}
> > +
> >  boolean nv50_blitter_create(struct nv50_screen *);
> >  void nv50_blitter_destroy(struct nv50_screen *);
> >  
> > diff --git a/src/gallium/drivers/nvc0/nvc0_context.h
> > b/src/gallium/drivers/nvc0/nvc0_context.h
> > index 0431b89..f62f147 100644
> > --- a/src/gallium/drivers/nvc0/nvc0_context.h
> > +++ b/src/gallium/drivers/nvc0/nvc0_context.h
> > @@ -347,7 +347,7 @@ nvc0_video_buffer_create(struct pipe_context *pipe,
> >                           const struct pipe_video_buffer *templat);
> >  
> >  int
> > -nvc0_screen_get_video_param(struct pipe_screen *pscreen,
> > +nvc0_screen_get_video_param(const struct pipe_screen *pscreen,
> >                              enum pipe_video_profile profile,
> >                              enum pipe_video_cap param);
> >  
> > diff --git a/src/gallium/drivers/nvc0/nvc0_screen.c
> > b/src/gallium/drivers/nvc0/nvc0_screen.c
> > index b5abee3..370770f 100644
> > --- a/src/gallium/drivers/nvc0/nvc0_screen.c
> > +++ b/src/gallium/drivers/nvc0/nvc0_screen.c
> > @@ -76,9 +76,9 @@ nvc0_screen_video_supported(struct pipe_screen *screen,
> >  
> >  
> >  static int
> > -nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
> > +nvc0_screen_get_param(const struct pipe_screen *pscreen, enum pipe_cap
> > param)
> >  {
> > -   const uint16_t class_3d = nouveau_screen(pscreen)->class_3d;
> > +   const uint16_t class_3d = nouveau_screen_const(pscreen)->class_3d;
> >  
> >     switch (param) {
> >     case PIPE_CAP_MAX_COMBINED_SAMPLERS:
> > @@ -186,10 +186,10 @@ nvc0_screen_get_param(struct pipe_screen *pscreen,
> > enum pipe_cap param)
> >  }
> >  
> >  static int
> > -nvc0_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
> > +nvc0_screen_get_shader_param(const struct pipe_screen *pscreen, unsigned
> > shader,
> >                               enum pipe_shader_cap param)
> >  {
> > -   const uint16_t class_3d = nouveau_screen(pscreen)->class_3d;
> > +   const uint16_t class_3d = nouveau_screen_const(pscreen)->class_3d;
> >  
> >     switch (shader) {
> >     case PIPE_SHADER_VERTEX:
> > @@ -271,7 +271,7 @@ nvc0_screen_get_shader_param(struct pipe_screen
> > *pscreen, unsigned shader,
> >  }
> >  
> >  static float
> > -nvc0_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
> > +nvc0_screen_get_paramf(const struct pipe_screen *pscreen, enum pipe_capf
> > param)
> >  {
> >     switch (param) {
> >     case PIPE_CAPF_MAX_LINE_WIDTH:
> > @@ -292,11 +292,11 @@ nvc0_screen_get_paramf(struct pipe_screen *pscreen,
> > enum pipe_capf param)
> >  }
> >  
> >  static int
> > -nvc0_screen_get_compute_param(struct pipe_screen *pscreen,
> > +nvc0_screen_get_compute_param(const struct pipe_screen *pscreen,
> >                                enum pipe_compute_cap param, void *data)
> >  {
> >     uint64_t *data64 = (uint64_t *)data;
> > -   const uint16_t obj_class = nvc0_screen(pscreen)->compute->oclass;
> > +   const uint16_t obj_class = nvc0_screen_const(pscreen)->compute->oclass;
> >  
> >     switch (param) {
> >     case PIPE_COMPUTE_CAP_GRID_DIMENSION:
> > diff --git a/src/gallium/drivers/nvc0/nvc0_screen.h
> > b/src/gallium/drivers/nvc0/nvc0_screen.h
> > index 826014e..6e054db 100644
> > --- a/src/gallium/drivers/nvc0/nvc0_screen.h
> > +++ b/src/gallium/drivers/nvc0/nvc0_screen.h
> > @@ -84,6 +84,13 @@ nvc0_screen(struct pipe_screen *screen)
> >     return (struct nvc0_screen *)screen;
> >  }
> >  
> > +static INLINE const struct nvc0_screen *
> > +nvc0_screen_const(const struct pipe_screen *screen)
> > +{
> > +   return (const struct nvc0_screen *)screen;
> > +}
> > +
> > +
> >  
> >  /* Performance counter queries:
> >   */
> > diff --git a/src/gallium/drivers/nvc0/nvc0_video.c
> > b/src/gallium/drivers/nvc0/nvc0_video.c
> > index ad40b94..50a0f3e 100644
> > --- a/src/gallium/drivers/nvc0/nvc0_video.c
> > +++ b/src/gallium/drivers/nvc0/nvc0_video.c
> > @@ -29,7 +29,7 @@
> >  #include <fcntl.h>
> >  
> >  int
> > -nvc0_screen_get_video_param(struct pipe_screen *pscreen,
> > +nvc0_screen_get_video_param(const struct pipe_screen *pscreen,
> >                              enum pipe_video_profile profile,
> >                              enum pipe_video_cap param)
> >  {
> > @@ -40,7 +40,7 @@ nvc0_screen_get_video_param(struct pipe_screen *pscreen,
> >        return 1;
> >     case PIPE_VIDEO_CAP_MAX_WIDTH:
> >     case PIPE_VIDEO_CAP_MAX_HEIGHT:
> > -      return nouveau_screen(pscreen)->device->chipset < 0xd0 ? 2048 :
> > 4096;
> > +      return nouveau_screen_const(pscreen)->device->chipset < 0xd0 ? 2048
> > : 4096;
> >     case PIPE_VIDEO_CAP_PREFERED_FORMAT:
> >        return PIPE_FORMAT_NV12;
> >     case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED:
> > diff --git a/src/gallium/drivers/r300/r300_screen.c
> > b/src/gallium/drivers/r300/r300_screen.c
> > index 9c5d5f2..d5e54db 100644
> > --- a/src/gallium/drivers/r300/r300_screen.c
> > +++ b/src/gallium/drivers/r300/r300_screen.c
> > @@ -42,7 +42,7 @@
> >   * ...I should have just put "Corbin Simpson", but I'm not that cool.
> >   *
> >   * (Or egotistical. Yet.) */
> > -static const char* r300_get_vendor(struct pipe_screen* pscreen)
> > +static const char* r300_get_vendor(const struct pipe_screen* pscreen)
> >  {
> >      return "X.Org R300 Project";
> >  }
> > @@ -74,16 +74,16 @@ static const char* chip_families[] = {
> >      "ATI RV570"
> >  };
> >  
> > -static const char* r300_get_name(struct pipe_screen* pscreen)
> > +static const char* r300_get_name(const struct pipe_screen* pscreen)
> >  {
> > -    struct r300_screen* r300screen = r300_screen(pscreen);
> > +    const struct r300_screen* r300screen = r300_screen_const(pscreen);
> >  
> >      return chip_families[r300screen->caps.family];
> >  }
> >  
> > -static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap
> > param)
> > +static int r300_get_param(const struct pipe_screen* pscreen, enum pipe_cap
> > param)
> >  {
> > -    struct r300_screen* r300screen = r300_screen(pscreen);
> > +    const struct r300_screen* r300screen = r300_screen_const(pscreen);
> >      boolean is_r500 = r300screen->caps.is_r500;
> >  
> >      switch (param) {
> > @@ -194,9 +194,9 @@ static int r300_get_param(struct pipe_screen* pscreen,
> > enum pipe_cap param)
> >      return 0;
> >  }
> >  
> > -static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned
> > shader, enum pipe_shader_cap param)
> > +static int r300_get_shader_param(const struct pipe_screen *pscreen,
> > unsigned shader, enum pipe_shader_cap param)
> >  {
> > -   struct r300_screen* r300screen = r300_screen(pscreen);
> > +   const struct r300_screen* r300screen = r300_screen_const(pscreen);
> >     boolean is_r400 = r300screen->caps.is_r400;
> >     boolean is_r500 = r300screen->caps.is_r500;
> >  
> > @@ -300,10 +300,10 @@ static int r300_get_shader_param(struct pipe_screen
> > *pscreen, unsigned shader, e
> >      return 0;
> >  }
> >  
> > -static float r300_get_paramf(struct pipe_screen* pscreen,
> > +static float r300_get_paramf(const struct pipe_screen* pscreen,
> >                               enum pipe_capf param)
> >  {
> > -    struct r300_screen* r300screen = r300_screen(pscreen);
> > +    const struct r300_screen* r300screen = r300_screen_const(pscreen);
> >  
> >      switch (param) {
> >          case PIPE_CAPF_MAX_LINE_WIDTH:
> > @@ -337,7 +337,7 @@ static float r300_get_paramf(struct pipe_screen*
> > pscreen,
> >      }
> >  }
> >  
> > -static int r300_get_video_param(struct pipe_screen *screen,
> > +static int r300_get_video_param(const struct pipe_screen *screen,
> >  				enum pipe_video_profile profile,
> >  				enum pipe_video_cap param)
> >  {
> > diff --git a/src/gallium/drivers/r300/r300_screen.h
> > b/src/gallium/drivers/r300/r300_screen.h
> > index e129cee..85d68d4 100644
> > --- a/src/gallium/drivers/r300/r300_screen.h
> > +++ b/src/gallium/drivers/r300/r300_screen.h
> > @@ -55,6 +55,11 @@ static INLINE struct r300_screen* r300_screen(struct
> > pipe_screen* screen) {
> >      return (struct r300_screen*)screen;
> >  }
> >  
> > +static INLINE const struct r300_screen* r300_screen_const(
> > +                                        const struct pipe_screen* screen)
> > {
> > +    return (const struct r300_screen*)screen;
> > +}
> > +
> >  static INLINE struct radeon_winsys *
> >  radeon_winsys(struct pipe_screen *screen) {
> >      return r300_screen(screen)->rws;
> > diff --git a/src/gallium/drivers/r600/r600_pipe.c
> > b/src/gallium/drivers/r600/r600_pipe.c
> > index a4e88ce..cd01948 100644
> > --- a/src/gallium/drivers/r600/r600_pipe.c
> > +++ b/src/gallium/drivers/r600/r600_pipe.c
> > @@ -508,7 +508,7 @@ fail:
> >  /*
> >   * pipe_screen
> >   */
> > -static const char* r600_get_vendor(struct pipe_screen* pscreen)
> > +static const char* r600_get_vendor(const struct pipe_screen* pscreen)
> >  {
> >  	return "X.Org";
> >  }
> > @@ -545,16 +545,16 @@ static const char *r600_get_family_name(enum
> > radeon_family family)
> >  	}
> >  }
> >  
> > -static const char* r600_get_name(struct pipe_screen* pscreen)
> > +static const char* r600_get_name(const struct pipe_screen* pscreen)
> >  {
> >  	struct r600_screen *rscreen = (struct r600_screen *)pscreen;
> >  
> >  	return r600_get_family_name(rscreen->family);
> >  }
> >  
> > -static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap
> > param)
> > +static int r600_get_param(const struct pipe_screen* pscreen, enum pipe_cap
> > param)
> >  {
> > -	struct r600_screen *rscreen = (struct r600_screen *)pscreen;
> > +	const struct r600_screen *rscreen = (const struct r600_screen *)pscreen;
> >  	enum radeon_family family = rscreen->family;
> >  
> >  	switch (param) {
> > @@ -682,7 +682,7 @@ static int r600_get_param(struct pipe_screen* pscreen,
> > enum pipe_cap param)
> >  	return 0;
> >  }
> >  
> > -static float r600_get_paramf(struct pipe_screen* pscreen,
> > +static float r600_get_paramf(const struct pipe_screen* pscreen,
> >  			     enum pipe_capf param)
> >  {
> >  	struct r600_screen *rscreen = (struct r600_screen *)pscreen;
> > @@ -710,7 +710,7 @@ static float r600_get_paramf(struct pipe_screen*
> > pscreen,
> >  	return 0.0f;
> >  }
> >  
> > -static int r600_get_shader_param(struct pipe_screen* pscreen, unsigned
> > shader, enum pipe_shader_cap param)
> > +static int r600_get_shader_param(const struct pipe_screen* pscreen,
> > unsigned shader, enum pipe_shader_cap param)
> >  {
> >  	switch(shader)
> >  	{
> > @@ -772,7 +772,7 @@ static int r600_get_shader_param(struct pipe_screen*
> > pscreen, unsigned shader, e
> >  	return 0;
> >  }
> >  
> > -static int r600_get_video_param(struct pipe_screen *screen,
> > +static int r600_get_video_param(const struct pipe_screen *screen,
> >  				enum pipe_video_profile profile,
> >  				enum pipe_video_cap param)
> >  {
> > @@ -865,7 +865,7 @@ const char * r600_llvm_gpu_string(enum radeon_family
> > family)
> >  }
> >  
> >  
> > -static int r600_get_compute_param(struct pipe_screen *screen,
> > +static int r600_get_compute_param(const struct pipe_screen *screen,
> >          enum pipe_compute_cap param,
> >          void *ret)
> >  {
> > diff --git a/src/gallium/drivers/r600/r600_pipe.h
> > b/src/gallium/drivers/r600/r600_pipe.h
> > index 3fad311..bc9bca2 100644
> > --- a/src/gallium/drivers/r600/r600_pipe.h
> > +++ b/src/gallium/drivers/r600/r600_pipe.h
> > @@ -899,7 +899,7 @@ struct pipe_video_decoder
> > *r600_uvd_create_decoder(struct pipe_context *context,
> >  struct pipe_video_buffer *r600_video_buffer_create(struct pipe_context
> >  *pipe,
> >  						   const struct pipe_video_buffer *tmpl);
> >  
> > -int r600_uvd_get_video_param(struct pipe_screen *screen,
> > +int r600_uvd_get_video_param(const struct pipe_screen *screen,
> >  			     enum pipe_video_profile profile,
> >  			     enum pipe_video_cap param);
> >  
> > diff --git a/src/gallium/drivers/r600/r600_uvd.c
> > b/src/gallium/drivers/r600/r600_uvd.c
> > index a077a50..9339b5e 100644
> > --- a/src/gallium/drivers/r600/r600_uvd.c
> > +++ b/src/gallium/drivers/r600/r600_uvd.c
> > @@ -178,7 +178,7 @@ struct pipe_video_decoder
> > *r600_uvd_create_decoder(struct pipe_context *context,
> >  				   ctx->ws, r600_uvd_set_dtb);
> >  }
> >  
> > -int r600_uvd_get_video_param(struct pipe_screen *screen,
> > +int r600_uvd_get_video_param(const struct pipe_screen *screen,
> >  			     enum pipe_video_profile profile,
> >  			     enum pipe_video_cap param)
> >  {
> > diff --git a/src/gallium/drivers/radeon/radeon_uvd.c
> > b/src/gallium/drivers/radeon/radeon_uvd.c
> > index caf3e90..1c6a66b 100644
> > --- a/src/gallium/drivers/radeon/radeon_uvd.c
> > +++ b/src/gallium/drivers/radeon/radeon_uvd.c
> > @@ -1081,7 +1081,7 @@ void ruvd_set_dt_surfaces(struct ruvd_msg *msg,
> > struct radeon_surface *luma,
> >  	msg->body.decode.dt_surf_tile_config |=
> >  	RUVD_MACRO_TILE_ASPECT_RATIO(macro_tile_aspect(luma->mtilea));
> >  }
> >  
> > -int ruvd_get_video_param(struct pipe_screen *screen,
> > +int ruvd_get_video_param(const struct pipe_screen *screen,
> >  			 enum pipe_video_profile profile,
> >  			 enum pipe_video_cap param)
> >  {
> > diff --git a/src/gallium/drivers/radeon/radeon_uvd.h
> > b/src/gallium/drivers/radeon/radeon_uvd.h
> > index 1e97425..710162f 100644
> > --- a/src/gallium/drivers/radeon/radeon_uvd.h
> > +++ b/src/gallium/drivers/radeon/radeon_uvd.h
> > @@ -365,7 +365,7 @@ void ruvd_set_dt_surfaces(struct ruvd_msg *msg, struct
> > radeon_surface *luma,
> >  			  struct radeon_surface *chroma);
> >  
> >  /* returns supported codecs and other parameters */
> > -int ruvd_get_video_param(struct pipe_screen *screen,
> > +int ruvd_get_video_param(const struct pipe_screen *screen,
> >  			 enum pipe_video_profile profile,
> >  			 enum pipe_video_cap param);
> >  
> > diff --git a/src/gallium/drivers/radeonsi/radeonsi_pipe.c
> > b/src/gallium/drivers/radeonsi/radeonsi_pipe.c
> > index 463cc72..9d8d600 100644
> > --- a/src/gallium/drivers/radeonsi/radeonsi_pipe.c
> > +++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.c
> > @@ -286,7 +286,7 @@ static struct pipe_context *r600_create_context(struct
> > pipe_screen *screen, void
> >  /*
> >   * pipe_screen
> >   */
> > -static const char* r600_get_vendor(struct pipe_screen* pscreen)
> > +static const char* r600_get_vendor(const struct pipe_screen* pscreen)
> >  {
> >  	return "X.Org";
> >  }
> > @@ -321,16 +321,16 @@ static const char *r600_get_family_name(enum
> > radeon_family family)
> >  	}
> >  }
> >  
> > -static const char* r600_get_name(struct pipe_screen* pscreen)
> > +static const char* r600_get_name(const struct pipe_screen* pscreen)
> >  {
> > -	struct r600_screen *rscreen = (struct r600_screen *)pscreen;
> > +	const struct r600_screen *rscreen = (const struct r600_screen *)pscreen;
> >  
> >  	return r600_get_family_name(rscreen->family);
> >  }
> >  
> > -static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap
> > param)
> > +static int r600_get_param(const struct pipe_screen* pscreen, enum pipe_cap
> > param)
> >  {
> > -	struct r600_screen *rscreen = (struct r600_screen *)pscreen;
> > +	const struct r600_screen *rscreen = (const struct r600_screen *)pscreen;
> >  
> >  	switch (param) {
> >  	/* Supported features (boolean caps). */
> > @@ -444,7 +444,7 @@ static int r600_get_param(struct pipe_screen* pscreen,
> > enum pipe_cap param)
> >  	return 0;
> >  }
> >  
> > -static float r600_get_paramf(struct pipe_screen* pscreen,
> > +static float r600_get_paramf(const struct pipe_screen* pscreen,
> >  			     enum pipe_capf param)
> >  {
> >  	switch (param) {
> > @@ -466,7 +466,7 @@ static float r600_get_paramf(struct pipe_screen*
> > pscreen,
> >  	return 0.0f;
> >  }
> >  
> > -static int r600_get_shader_param(struct pipe_screen* pscreen, unsigned
> > shader, enum pipe_shader_cap param)
> > +static int r600_get_shader_param(const struct pipe_screen* pscreen,
> > unsigned shader, enum pipe_shader_cap param)
> >  {
> >  	switch(shader)
> >  	{
> > @@ -530,7 +530,7 @@ static int r600_get_shader_param(struct pipe_screen*
> > pscreen, unsigned shader, e
> >  	return 0;
> >  }
> >  
> > -static int r600_get_video_param(struct pipe_screen *screen,
> > +static int r600_get_video_param(const struct pipe_screen *screen,
> >  				enum pipe_video_profile profile,
> >  				enum pipe_video_cap param)
> >  {
> > @@ -549,11 +549,11 @@ static int r600_get_video_param(struct pipe_screen
> > *screen,
> >  	}
> >  }
> >  
> > -static int r600_get_compute_param(struct pipe_screen *screen,
> > +static int r600_get_compute_param(const struct pipe_screen *screen,
> >          enum pipe_compute_cap param,
> >          void *ret)
> >  {
> > -	struct r600_screen *rscreen = (struct r600_screen *)screen;
> > +	const struct r600_screen *rscreen = (const struct r600_screen *)screen;
> >  	//TODO: select these params by asic
> >  	switch (param) {
> >  	case PIPE_COMPUTE_CAP_IR_TARGET: {
> > diff --git a/src/gallium/drivers/rbug/rbug_screen.c
> > b/src/gallium/drivers/rbug/rbug_screen.c
> > index 2471fdb..ec79317 100644
> > --- a/src/gallium/drivers/rbug/rbug_screen.c
> > +++ b/src/gallium/drivers/rbug/rbug_screen.c
> > @@ -51,28 +51,28 @@ rbug_screen_destroy(struct pipe_screen *_screen)
> >  }
> >  
> >  static const char *
> > -rbug_screen_get_name(struct pipe_screen *_screen)
> > +rbug_screen_get_name(const struct pipe_screen *_screen)
> >  {
> > -   struct rbug_screen *rb_screen = rbug_screen(_screen);
> > +   const struct rbug_screen *rb_screen = rbug_screen_const(_screen);
> >     struct pipe_screen *screen = rb_screen->screen;
> >  
> >     return screen->get_name(screen);
> >  }
> >  
> >  static const char *
> > -rbug_screen_get_vendor(struct pipe_screen *_screen)
> > +rbug_screen_get_vendor(const struct pipe_screen *_screen)
> >  {
> > -   struct rbug_screen *rb_screen = rbug_screen(_screen);
> > +   const struct rbug_screen *rb_screen = rbug_screen_const(_screen);
> >     struct pipe_screen *screen = rb_screen->screen;
> >  
> >     return screen->get_vendor(screen);
> >  }
> >  
> >  static int
> > -rbug_screen_get_param(struct pipe_screen *_screen,
> > +rbug_screen_get_param(const struct pipe_screen *_screen,
> >                        enum pipe_cap param)
> >  {
> > -   struct rbug_screen *rb_screen = rbug_screen(_screen);
> > +   const struct rbug_screen *rb_screen = rbug_screen_const(_screen);
> >     struct pipe_screen *screen = rb_screen->screen;
> >  
> >     return screen->get_param(screen,
> > @@ -80,10 +80,10 @@ rbug_screen_get_param(struct pipe_screen *_screen,
> >  }
> >  
> >  static int
> > -rbug_screen_get_shader_param(struct pipe_screen *_screen,
> > +rbug_screen_get_shader_param(const struct pipe_screen *_screen,
> >                        unsigned shader, enum pipe_shader_cap param)
> >  {
> > -   struct rbug_screen *rb_screen = rbug_screen(_screen);
> > +   const struct rbug_screen *rb_screen = rbug_screen_const(_screen);
> >     struct pipe_screen *screen = rb_screen->screen;
> >  
> >     return screen->get_shader_param(screen, shader,
> > @@ -91,10 +91,10 @@ rbug_screen_get_shader_param(struct pipe_screen
> > *_screen,
> >  }
> >  
> >  static float
> > -rbug_screen_get_paramf(struct pipe_screen *_screen,
> > +rbug_screen_get_paramf(const struct pipe_screen *_screen,
> >                         enum pipe_capf param)
> >  {
> > -   struct rbug_screen *rb_screen = rbug_screen(_screen);
> > +   const struct rbug_screen *rb_screen = rbug_screen_const(_screen);
> >     struct pipe_screen *screen = rb_screen->screen;
> >  
> >     return screen->get_paramf(screen,
> > diff --git a/src/gallium/drivers/rbug/rbug_screen.h
> > b/src/gallium/drivers/rbug/rbug_screen.h
> > index a53afac..9a00c26 100644
> > --- a/src/gallium/drivers/rbug/rbug_screen.h
> > +++ b/src/gallium/drivers/rbug/rbug_screen.h
> > @@ -66,6 +66,13 @@ rbug_screen(struct pipe_screen *screen)
> >     return (struct rbug_screen *)screen;
> >  }
> >  
> > +static INLINE const struct rbug_screen *
> > +rbug_screen_const(const struct pipe_screen *screen)
> > +{
> > +   return (const struct rbug_screen *)screen;
> > +}
> > +
> > +
> >  #define rbug_screen_add_to_list(scr, name, obj) \
> >     do {                                          \
> >        pipe_mutex_lock(scr->list_mutex);          \
> > diff --git a/src/gallium/drivers/softpipe/sp_screen.c
> > b/src/gallium/drivers/softpipe/sp_screen.c
> > index 2abfe89..b8acda5 100644
> > --- a/src/gallium/drivers/softpipe/sp_screen.c
> > +++ b/src/gallium/drivers/softpipe/sp_screen.c
> > @@ -49,21 +49,21 @@
> >  DEBUG_GET_ONCE_BOOL_OPTION(use_llvm, "SOFTPIPE_USE_LLVM", FALSE)
> >  
> >  static const char *
> > -softpipe_get_vendor(struct pipe_screen *screen)
> > +softpipe_get_vendor(const struct pipe_screen *screen)
> >  {
> >     return "VMware, Inc.";
> >  }
> >  
> >  
> >  static const char *
> > -softpipe_get_name(struct pipe_screen *screen)
> > +softpipe_get_name(const struct pipe_screen *screen)
> >  {
> >     return "softpipe";
> >  }
> >  
> >  
> >  static int
> > -softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
> > +softpipe_get_param(const struct pipe_screen *screen, enum pipe_cap param)
> >  {
> >     switch (param) {
> >     case PIPE_CAP_MAX_COMBINED_SAMPLERS:
> > @@ -190,9 +190,9 @@ softpipe_get_param(struct pipe_screen *screen, enum
> > pipe_cap param)
> >  }
> >  
> >  static int
> > -softpipe_get_shader_param(struct pipe_screen *screen, unsigned shader,
> > enum pipe_shader_cap param)
> > +softpipe_get_shader_param(const struct pipe_screen *screen, unsigned
> > shader, enum pipe_shader_cap param)
> >  {
> > -   struct softpipe_screen *sp_screen = softpipe_screen(screen);
> > +   const struct softpipe_screen *sp_screen =
> > softpipe_screen_const(screen);
> >     switch(shader)
> >     {
> >     case PIPE_SHADER_FRAGMENT:
> > @@ -218,7 +218,7 @@ softpipe_get_shader_param(struct pipe_screen *screen,
> > unsigned shader, enum pipe
> >  }
> >  
> >  static float
> > -softpipe_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
> > +softpipe_get_paramf(const struct pipe_screen *screen, enum pipe_capf
> > param)
> >  {
> >     switch (param) {
> >     case PIPE_CAPF_MAX_LINE_WIDTH:
> > @@ -245,7 +245,7 @@ softpipe_get_paramf(struct pipe_screen *screen, enum
> > pipe_capf param)
> >  }
> >  
> >  static int
> > -softpipe_get_video_param(struct pipe_screen *screen,
> > +softpipe_get_video_param(const struct pipe_screen *screen,
> >                           enum pipe_video_profile profile,
> >                           enum pipe_video_cap param)
> >  {
> > diff --git a/src/gallium/drivers/softpipe/sp_screen.h
> > b/src/gallium/drivers/softpipe/sp_screen.h
> > index 007feec..2ad5ca5 100644
> > --- a/src/gallium/drivers/softpipe/sp_screen.h
> > +++ b/src/gallium/drivers/softpipe/sp_screen.h
> > @@ -55,6 +55,11 @@ softpipe_screen( struct pipe_screen *pipe )
> >     return (struct softpipe_screen *)pipe;
> >  }
> >  
> > +static INLINE const struct softpipe_screen *
> > +softpipe_screen_const( const struct pipe_screen *pipe )
> > +{
> > +   return (const struct softpipe_screen *)pipe;
> > +}
> >  
> >  
> >  #endif /* SP_SCREEN_H */
> > diff --git a/src/gallium/drivers/svga/svga_screen.c
> > b/src/gallium/drivers/svga/svga_screen.c
> > index 7bf6285..f0a79d4 100644
> > --- a/src/gallium/drivers/svga/svga_screen.c
> > +++ b/src/gallium/drivers/svga/svga_screen.c
> > @@ -63,14 +63,14 @@ static const struct debug_named_value
> > svga_debug_flags[] = {
> >  #endif
> >  
> >  static const char *
> > -svga_get_vendor( struct pipe_screen *pscreen )
> > +svga_get_vendor( const struct pipe_screen *pscreen )
> >  {
> >     return "VMware, Inc.";
> >  }
> >  
> >  
> >  static const char *
> > -svga_get_name( struct pipe_screen *pscreen )
> > +svga_get_name( const struct pipe_screen *pscreen )
> >  {
> >     const char *build = "", *llvm = "", *mutex = "";
> >     static char name[100];
> > @@ -94,9 +94,9 @@ svga_get_name( struct pipe_screen *pscreen )
> >  
> >  
> >  static float
> > -svga_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
> > +svga_get_paramf(const struct pipe_screen *screen, enum pipe_capf param)
> >  {
> > -   struct svga_screen *svgascreen = svga_screen(screen);
> > +   const struct svga_screen *svgascreen = svga_screen_const(screen);
> >     struct svga_winsys_screen *sws = svgascreen->sws;
> >     SVGA3dDevCapResult result;
> >  
> > @@ -131,9 +131,9 @@ svga_get_paramf(struct pipe_screen *screen, enum
> > pipe_capf param)
> >  
> >  
> >  static int
> > -svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
> > +svga_get_param(const struct pipe_screen *screen, enum pipe_cap param)
> >  {
> > -   struct svga_screen *svgascreen = svga_screen(screen);
> > +   const struct svga_screen *svgascreen = svga_screen_const(screen);
> >     struct svga_winsys_screen *sws = svgascreen->sws;
> >     SVGA3dDevCapResult result;
> >  
> > @@ -276,9 +276,9 @@ svga_get_param(struct pipe_screen *screen, enum
> > pipe_cap param)
> >     return 0;
> >  }
> >  
> > -static int svga_get_shader_param(struct pipe_screen *screen, unsigned
> > shader, enum pipe_shader_cap param)
> > +static int svga_get_shader_param(const struct pipe_screen *screen,
> > unsigned shader, enum pipe_shader_cap param)
> >  {
> > -   struct svga_screen *svgascreen = svga_screen(screen);
> > +   const struct svga_screen *svgascreen = svga_screen_const(screen);
> >     struct svga_winsys_screen *sws = svgascreen->sws;
> >     SVGA3dDevCapResult result;
> >  
> > @@ -680,4 +680,12 @@ svga_screen(struct pipe_screen *screen)
> >     assert(screen->destroy == svga_destroy_screen);
> >     return (struct svga_screen *)screen;
> >  }
> > +
> > +const struct svga_screen *
> > +svga_screen_const(const struct pipe_screen *screen)
> > +{
> > +   assert(screen);
> > +   assert(screen->destroy == svga_destroy_screen);
> > +   return (const struct svga_screen *)screen;
> > +}
> >  #endif
> > diff --git a/src/gallium/drivers/svga/svga_screen.h
> > b/src/gallium/drivers/svga/svga_screen.h
> > index 77b552a..970fef2 100644
> > --- a/src/gallium/drivers/svga/svga_screen.h
> > +++ b/src/gallium/drivers/svga/svga_screen.h
> > @@ -85,9 +85,18 @@ svga_screen(struct pipe_screen *pscreen)
> >  {
> >     return (struct svga_screen *) pscreen;
> >  }
> > +
> > +static INLINE const struct svga_screen *
> > +svga_screen(const struct pipe_screen *pscreen)
> > +{
> > +   return (const struct svga_screen *) pscreen;
> > +}
> >  #else
> >  struct svga_screen *
> >  svga_screen(struct pipe_screen *screen);
> > +
> > +const struct svga_screen *
> > +svga_screen_const(const struct pipe_screen *screen);
> >  #endif
> >  
> >  #endif /* SVGA_SCREEN_H */
> > diff --git a/src/gallium/drivers/trace/tr_screen.c
> > b/src/gallium/drivers/trace/tr_screen.c
> > index 5281ba8..6a9234f 100644
> > --- a/src/gallium/drivers/trace/tr_screen.c
> > +++ b/src/gallium/drivers/trace/tr_screen.c
> > @@ -42,9 +42,9 @@
> >  static boolean trace = FALSE;
> >  
> >  static const char *
> > -trace_screen_get_name(struct pipe_screen *_screen)
> > +trace_screen_get_name(const struct pipe_screen *_screen)
> >  {
> > -   struct trace_screen *tr_scr = trace_screen(_screen);
> > +   const struct trace_screen *tr_scr = trace_screen_const(_screen);
> >     struct pipe_screen *screen = tr_scr->screen;
> >     const char *result;
> >  
> > @@ -63,9 +63,9 @@ trace_screen_get_name(struct pipe_screen *_screen)
> >  
> >  
> >  static const char *
> > -trace_screen_get_vendor(struct pipe_screen *_screen)
> > +trace_screen_get_vendor(const struct pipe_screen *_screen)
> >  {
> > -   struct trace_screen *tr_scr = trace_screen(_screen);
> > +   const struct trace_screen *tr_scr = trace_screen_const(_screen);
> >     struct pipe_screen *screen = tr_scr->screen;
> >     const char *result;
> >  
> > @@ -84,10 +84,10 @@ trace_screen_get_vendor(struct pipe_screen *_screen)
> >  
> >  
> >  static int
> > -trace_screen_get_param(struct pipe_screen *_screen,
> > +trace_screen_get_param(const struct pipe_screen *_screen,
> >                         enum pipe_cap param)
> >  {
> > -   struct trace_screen *tr_scr = trace_screen(_screen);
> > +   const struct trace_screen *tr_scr = trace_screen_const(_screen);
> >     struct pipe_screen *screen = tr_scr->screen;
> >     int result;
> >  
> > @@ -107,10 +107,10 @@ trace_screen_get_param(struct pipe_screen *_screen,
> >  
> >  
> >  static int
> > -trace_screen_get_shader_param(struct pipe_screen *_screen, unsigned
> > shader,
> > +trace_screen_get_shader_param(const struct pipe_screen *_screen, unsigned
> > shader,
> >                         enum pipe_shader_cap param)
> >  {
> > -   struct trace_screen *tr_scr = trace_screen(_screen);
> > +   const struct trace_screen *tr_scr = trace_screen_const(_screen);
> >     struct pipe_screen *screen = tr_scr->screen;
> >     int result;
> >  
> > @@ -131,10 +131,10 @@ trace_screen_get_shader_param(struct pipe_screen
> > *_screen, unsigned shader,
> >  
> >  
> >  static float
> > -trace_screen_get_paramf(struct pipe_screen *_screen,
> > +trace_screen_get_paramf(const struct pipe_screen *_screen,
> >                          enum pipe_capf param)
> >  {
> > -   struct trace_screen *tr_scr = trace_screen(_screen);
> > +   const struct trace_screen *tr_scr = trace_screen_const(_screen);
> >     struct pipe_screen *screen = tr_scr->screen;
> >     float result;
> >  
> > @@ -508,3 +508,11 @@ trace_screen(struct pipe_screen *screen)
> >     assert(screen->destroy == trace_screen_destroy);
> >     return (struct trace_screen *)screen;
> >  }
> > +
> > +const struct trace_screen *
> > +trace_screen_const(const struct pipe_screen *screen)
> > +{
> > +   assert(screen);
> > +   assert(screen->destroy == trace_screen_destroy);
> > +   return (const struct trace_screen *)screen;
> > +}
> > diff --git a/src/gallium/drivers/trace/tr_screen.h
> > b/src/gallium/drivers/trace/tr_screen.h
> > index 385015d..d0ce350 100644
> > --- a/src/gallium/drivers/trace/tr_screen.h
> > +++ b/src/gallium/drivers/trace/tr_screen.h
> > @@ -57,6 +57,8 @@ struct trace_screen
> >  struct trace_screen *
> >  trace_screen(struct pipe_screen *screen);
> >  
> > +const struct trace_screen *
> > +trace_screen_const(const struct pipe_screen *screen);
> >  
> >  #ifdef __cplusplus
> >  }
> > diff --git a/src/gallium/include/pipe/p_screen.h
> > b/src/gallium/include/pipe/p_screen.h
> > index c487e8e..decc08e 100644
> > --- a/src/gallium/include/pipe/p_screen.h
> > +++ b/src/gallium/include/pipe/p_screen.h
> > @@ -66,33 +66,33 @@ struct pipe_transfer;
> >  struct pipe_screen {
> >     void (*destroy)( struct pipe_screen * );
> >  
> > -   const char *(*get_name)( struct pipe_screen * );
> > +   const char *(*get_name)( const struct pipe_screen * );
> >  
> > -   const char *(*get_vendor)( struct pipe_screen * );
> > +   const char *(*get_vendor)( const struct pipe_screen * );
> >  
> >     /**
> >      * Query an integer-valued capability/parameter/limit
> >      * \param param  one of PIPE_CAP_x
> >      */
> > -   int (*get_param)( struct pipe_screen *, enum pipe_cap param );
> > +   int (*get_param)( const struct pipe_screen *, enum pipe_cap param );
> >  
> >     /**
> >      * Query a float-valued capability/parameter/limit
> >      * \param param  one of PIPE_CAP_x
> >      */
> > -   float (*get_paramf)( struct pipe_screen *, enum pipe_capf param );
> > +   float (*get_paramf)( const struct pipe_screen *, enum pipe_capf param
> > );
> >  
> >     /**
> >      * Query a per-shader-stage integer-valued capability/parameter/limit
> >      * \param param  one of PIPE_CAP_x
> >      */
> > -   int (*get_shader_param)( struct pipe_screen *, unsigned shader, enum
> > pipe_shader_cap param );
> > +   int (*get_shader_param)( const struct pipe_screen *, unsigned shader,
> > enum pipe_shader_cap param );
> >  
> >     /**
> >      * Query an integer-valued capability/parameter/limit for a
> >      codec/profile
> >      * \param param  one of PIPE_VIDEO_CAP_x
> >      */
> > -   int (*get_video_param)( struct pipe_screen *,
> > +   int (*get_video_param)( const struct pipe_screen *,
> >  			   enum pipe_video_profile profile,
> >  			   enum pipe_video_cap param );
> >  
> > @@ -104,7 +104,7 @@ struct pipe_screen {
> >      * \return       size in bytes of the parameter value that would be
> >      *               returned.
> >      */
> > -   int (*get_compute_param)(struct pipe_screen *,
> > +   int (*get_compute_param)(const struct pipe_screen *,
> >  			    enum pipe_compute_cap param,
> >  			    void *ret);
> >  
> > diff --git a/src/gallium/state_trackers/clover/core/device.hpp
> > b/src/gallium/state_trackers/clover/core/device.hpp
> > index 465af9f..4d89315 100644
> > --- a/src/gallium/state_trackers/clover/core/device.hpp
> > +++ b/src/gallium/state_trackers/clover/core/device.hpp
> > @@ -74,6 +74,7 @@ public:
> >     clover::supported_formats(cl_context, cl_mem_object_type);
> >  
> >     clover::platform &platform;
> > +   const struct pipe_screen *get_pipe() const { return pipe; }
> >  
> >  private:
> >     pipe_screen *pipe;
> > --
> > 1.7.11.4
> > 
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 


More information about the mesa-dev mailing list