[Mesa-dev] [PATCH 7/9] gallium: decrease the size of pipe_resource - 64 -> 48 bytes

Marek Olšák maraeo at gmail.com
Sun Apr 2 18:00:28 UTC 2017


From: Marek Olšák <marek.olsak at amd.com>

Some other changes needed here.
---
 src/gallium/auxiliary/rbug/rbug_texture.c  |  4 ++--
 src/gallium/auxiliary/rbug/rbug_texture.h  |  4 ++--
 src/gallium/auxiliary/vl/vl_video_buffer.h |  2 +-
 src/gallium/drivers/rbug/rbug_core.c       |  2 +-
 src/gallium/include/pipe/p_state.h         | 10 +++++-----
 src/gallium/state_trackers/vdpau/surface.c |  8 +++++---
 src/mesa/state_tracker/st_cb_texture.c     | 15 ++++++++++-----
 src/mesa/state_tracker/st_texture.c        | 17 +++++++++--------
 src/mesa/state_tracker/st_texture.h        | 14 +++++++-------
 9 files changed, 42 insertions(+), 34 deletions(-)

diff --git a/src/gallium/auxiliary/rbug/rbug_texture.c b/src/gallium/auxiliary/rbug/rbug_texture.c
index ca05147..3ee5e14 100644
--- a/src/gallium/auxiliary/rbug/rbug_texture.c
+++ b/src/gallium/auxiliary/rbug/rbug_texture.c
@@ -276,23 +276,23 @@ int rbug_send_texture_list_reply(struct rbug_connection *__con,
 	FREE(__data);
 	return __ret;
 }
 
 int rbug_send_texture_info_reply(struct rbug_connection *__con,
                                  uint32_t serial,
                                  uint32_t target,
                                  uint32_t format,
                                  uint32_t *width,
                                  uint32_t width_len,
-                                 uint32_t *height,
+                                 uint16_t *height,
                                  uint32_t height_len,
-                                 uint32_t *depth,
+                                 uint16_t *depth,
                                  uint32_t depth_len,
                                  uint32_t blockw,
                                  uint32_t blockh,
                                  uint32_t blocksize,
                                  uint32_t last_level,
                                  uint32_t nr_samples,
                                  uint32_t tex_usage,
                                  uint32_t *__serial)
 {
 	uint32_t __len = 0;
diff --git a/src/gallium/auxiliary/rbug/rbug_texture.h b/src/gallium/auxiliary/rbug/rbug_texture.h
index 59c9140..269e596 100644
--- a/src/gallium/auxiliary/rbug/rbug_texture.h
+++ b/src/gallium/auxiliary/rbug/rbug_texture.h
@@ -159,23 +159,23 @@ int rbug_send_texture_list_reply(struct rbug_connection *__con,
                                  rbug_texture_t *textures,
                                  uint32_t textures_len,
                                  uint32_t *__serial);
 
 int rbug_send_texture_info_reply(struct rbug_connection *__con,
                                  uint32_t serial,
                                  uint32_t target,
                                  uint32_t format,
                                  uint32_t *width,
                                  uint32_t width_len,
-                                 uint32_t *height,
+                                 uint16_t *height,
                                  uint32_t height_len,
-                                 uint32_t *depth,
+                                 uint16_t *depth,
                                  uint32_t depth_len,
                                  uint32_t blockw,
                                  uint32_t blockh,
                                  uint32_t blocksize,
                                  uint32_t last_level,
                                  uint32_t nr_samples,
                                  uint32_t tex_usage,
                                  uint32_t *__serial);
 
 int rbug_send_texture_read_reply(struct rbug_connection *__con,
diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.h b/src/gallium/auxiliary/vl/vl_video_buffer.h
index 8a1c077..1dc47c8 100644
--- a/src/gallium/auxiliary/vl/vl_video_buffer.h
+++ b/src/gallium/auxiliary/vl/vl_video_buffer.h
@@ -42,21 +42,21 @@ struct vl_video_buffer
 {
    struct pipe_video_buffer base;
    unsigned                 num_planes;
    struct pipe_resource     *resources[VL_NUM_COMPONENTS];
    struct pipe_sampler_view *sampler_view_planes[VL_NUM_COMPONENTS];
    struct pipe_sampler_view *sampler_view_components[VL_NUM_COMPONENTS];
    struct pipe_surface      *surfaces[VL_MAX_SURFACES];
 };
 
 static inline void
-vl_video_buffer_adjust_size(unsigned *width, unsigned *height, unsigned plane,
+vl_video_buffer_adjust_size(unsigned *width, uint16_t *height, unsigned plane,
                             enum pipe_video_chroma_format chroma_format,
                             bool interlaced)
 {
    if (interlaced) {
       *height /= 2;
    }
    if (plane > 0) {
       if (chroma_format == PIPE_VIDEO_CHROMA_FORMAT_420) {
          *width /= 2;
          *height /= 2;
diff --git a/src/gallium/drivers/rbug/rbug_core.c b/src/gallium/drivers/rbug/rbug_core.c
index 64c2d63..82bcef8 100644
--- a/src/gallium/drivers/rbug/rbug_core.c
+++ b/src/gallium/drivers/rbug/rbug_core.c
@@ -198,21 +198,21 @@ rbug_texture_list(struct rbug_rbug *tr_rbug, struct rbug_header *header, uint32_
 }
 
 static int
 rbug_texture_info(struct rbug_rbug *tr_rbug, struct rbug_header *header, uint32_t serial)
 {
    struct rbug_screen *rb_screen = tr_rbug->rb_screen;
    struct rbug_resource *tr_tex = NULL;
    struct rbug_proto_texture_info *gpti = (struct rbug_proto_texture_info *)header;
    struct rbug_list *ptr;
    struct pipe_resource *t;
-   unsigned num_layers;
+   uint16_t num_layers;
 
    mtx_lock(&rb_screen->list_mutex);
    foreach(ptr, &rb_screen->resources) {
       tr_tex = container_of(ptr, struct rbug_resource, list);
       if (gpti->texture == VOID2U64(tr_tex))
          break;
       tr_tex = NULL;
    }
 
    if (!tr_tex) {
diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
index 6a147ef..ae7f1c3 100644
--- a/src/gallium/include/pipe/p_state.h
+++ b/src/gallium/include/pipe/p_state.h
@@ -487,28 +487,28 @@ struct pipe_box
 };
 
 
 /**
  * A memory object/resource such as a vertex buffer or texture.
  */
 struct pipe_resource
 {
    struct pipe_reference reference;
    struct pipe_screen *screen; /**< screen that this texture belongs to */
-   enum pipe_texture_target target; /**< PIPE_TEXTURE_x */
-   enum pipe_format format;         /**< PIPE_FORMAT_x */
 
    unsigned width0;
-   unsigned height0;
-   unsigned depth0;
-   unsigned array_size;
+   uint16_t height0;
+   uint16_t depth0;
+   uint16_t array_size;
 
+   enum pipe_format format:16;         /**< PIPE_FORMAT_x */
+   enum pipe_texture_target target:8; /**< PIPE_TEXTURE_x */
    unsigned last_level:8;    /**< Index of last mipmap level present/defined */
    unsigned nr_samples:8;    /**< for multisampled surfaces, nr of samples */
    unsigned usage:8;         /**< PIPE_USAGE_x (not a bitmask) */
 
    unsigned bind;            /**< bitmask of PIPE_BIND_x */
    unsigned flags;           /**< bitmask of PIPE_RESOURCE_FLAG_x */
 
    /**
     * For planar images, ie. YUV EGLImage external, etc, pointer to the
     * next plane.
diff --git a/src/gallium/state_trackers/vdpau/surface.c b/src/gallium/state_trackers/vdpau/surface.c
index 884ae30..0e679d7 100644
--- a/src/gallium/state_trackers/vdpau/surface.c
+++ b/src/gallium/state_trackers/vdpau/surface.c
@@ -173,21 +173,21 @@ vlVdpVideoSurfaceGetParameters(VdpVideoSurface surface,
       *width = p_surf->templat.width;
       *height = p_surf->templat.height;
       *chroma_type = PipeToChroma(p_surf->templat.chroma_format);
    }
 
    return VDP_STATUS_OK;
 }
 
 static void
 vlVdpVideoSurfaceSize(vlVdpSurface *p_surf, int component,
-                      unsigned *width, unsigned *height)
+                      unsigned *width, uint16_t *height)
 {
    *width = p_surf->templat.width;
    *height = p_surf->templat.height;
 
    vl_video_buffer_adjust_size(width, height, component,
                                p_surf->templat.chroma_format,
                                p_surf->templat.interlaced);
 }
 
 /**
@@ -239,21 +239,22 @@ vlVdpVideoSurfaceGetBitsYCbCr(VdpVideoSurface surface,
    }
 
    mtx_lock(&vlsurface->device->mutex);
    sampler_views = vlsurface->video_buffer->get_sampler_view_planes(vlsurface->video_buffer);
    if (!sampler_views) {
       mtx_unlock(&vlsurface->device->mutex);
       return VDP_STATUS_RESOURCES;
    }
 
    for (i = 0; i < 3; ++i) {
-      unsigned width, height;
+      unsigned width;
+      uint16_t height;
       struct pipe_sampler_view *sv = sampler_views[i];
       if (!sv) continue;
 
       vlVdpVideoSurfaceSize(vlsurface, i, &width, &height);
 
       for (j = 0; j < sv->texture->array_size; ++j) {
          struct pipe_box box = {
             0, 0, j,
             width, height, 1
          };
@@ -371,21 +372,22 @@ vlVdpVideoSurfacePutBitsYCbCr(VdpVideoSurface surface,
          return VDP_STATUS_NO_IMPLEMENTATION;
    }
 
    sampler_views = p_surf->video_buffer->get_sampler_view_planes(p_surf->video_buffer);
    if (!sampler_views) {
       mtx_unlock(&p_surf->device->mutex);
       return VDP_STATUS_RESOURCES;
    }
 
    for (i = 0; i < 3; ++i) {
-      unsigned width, height;
+      unsigned width;
+      uint16_t height;
       struct pipe_sampler_view *sv = sampler_views[i];
       struct pipe_resource *tex;
       if (!sv || !source_pitches[i]) continue;
 
       tex = sv->texture;
       vlVdpVideoSurfaceSize(p_surf, i, &width, &height);
 
       for (j = 0; j < tex->array_size; ++j) {
          struct pipe_box dst_box = {
             0, 0, j,
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index 1b486d7..99c59f7 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -490,21 +490,22 @@ allocate_full_mipmap(const struct st_texture_object *stObj,
  * \return GL_TRUE for success, GL_FALSE if out of memory.
  */
 static GLboolean
 guess_and_alloc_texture(struct st_context *st,
 			struct st_texture_object *stObj,
 			const struct st_texture_image *stImage)
 {
    const struct gl_texture_image *firstImage;
    GLuint lastLevel, width, height, depth;
    GLuint bindings;
-   GLuint ptWidth, ptHeight, ptDepth, ptLayers;
+   unsigned ptWidth;
+   uint16_t ptHeight, ptDepth, ptLayers;
    enum pipe_format fmt;
    bool guessed_box = false;
 
    DBG("%s\n", __func__);
 
    assert(!stObj->pt);
 
    /* If a base level image with compatible size exists, use that as our guess.
     */
    firstImage = _mesa_base_tex_image(&stObj->base);
@@ -642,21 +643,22 @@ st_AllocTextureImageBuffer(struct gl_context *ctx,
    else {
       /* Create a new, temporary texture/resource/buffer to hold this
        * one texture image.  Note that when we later access this image
        * (either for mapping or copying) we'll want to always specify
        * mipmap level=0, even if the image represents some other mipmap
        * level.
        */
       enum pipe_format format =
          st_mesa_format_to_pipe_format(st, texImage->TexFormat);
       GLuint bindings = default_bindings(st, format);
-      GLuint ptWidth, ptHeight, ptDepth, ptLayers;
+      unsigned ptWidth;
+      uint16_t ptHeight, ptDepth, ptLayers;
 
       st_gl_texture_dims_to_pipe_dims(stObj->base.Target,
                                       width, height, depth,
                                       &ptWidth, &ptHeight, &ptDepth, &ptLayers);
 
       stImage->pt = st_texture_create(st,
                                       gl_target_to_pipe(stObj->base.Target),
                                       format,
                                       0, /* lastLevel */
                                       ptWidth,
@@ -2436,21 +2438,22 @@ st_finalize_texture(struct gl_context *ctx,
 		    struct pipe_context *pipe,
 		    struct gl_texture_object *tObj,
 		    GLuint cubeMapFace)
 {
    struct st_context *st = st_context(ctx);
    struct st_texture_object *stObj = st_texture_object(tObj);
    const GLuint nr_faces = _mesa_num_tex_faces(stObj->base.Target);
    GLuint face;
    const struct st_texture_image *firstImage;
    enum pipe_format firstImageFormat;
-   GLuint ptWidth, ptHeight, ptDepth, ptLayers, ptNumSamples;
+   unsigned ptWidth;
+   uint16_t ptHeight, ptDepth, ptLayers, ptNumSamples;
 
    if (tObj->Immutable)
       return GL_TRUE;
 
    if (_mesa_is_texture_complete(tObj, &tObj->Sampler)) {
       /* The texture is complete and we know exactly how many mipmap levels
        * are present/needed.  This is conditional because we may be called
        * from the st_generate_mipmap() function when the texture object is
        * incomplete.  In that case, we'll have set stObj->lastLevel before
        * we get here.
@@ -2498,21 +2501,22 @@ st_finalize_texture(struct gl_context *ctx,
    if (stObj->surface_based) {
       return GL_TRUE;
    }
 
    /* Find gallium format for the Mesa texture */
    firstImageFormat =
       st_mesa_format_to_pipe_format(st, firstImage->base.TexFormat);
 
    /* Find size of level=0 Gallium mipmap image, plus number of texture layers */
    {
-      GLuint width, height, depth;
+      unsigned width;
+      uint16_t height, depth;
 
       st_gl_texture_dims_to_pipe_dims(stObj->base.Target,
                                       firstImage->base.Width2,
                                       firstImage->base.Height2,
                                       firstImage->base.Depth2,
                                       &width, &height, &depth, &ptLayers);
 
       /* If we previously allocated a pipe texture and its sizes are
        * compatible, use them.
        */
@@ -2639,21 +2643,22 @@ static GLboolean
 st_AllocTextureStorage(struct gl_context *ctx,
                        struct gl_texture_object *texObj,
                        GLsizei levels, GLsizei width,
                        GLsizei height, GLsizei depth)
 {
    const GLuint numFaces = _mesa_num_tex_faces(texObj->Target);
    struct gl_texture_image *texImage = texObj->Image[0][0];
    struct st_context *st = st_context(ctx);
    struct st_texture_object *stObj = st_texture_object(texObj);
    struct pipe_screen *screen = st->pipe->screen;
-   GLuint ptWidth, ptHeight, ptDepth, ptLayers, bindings;
+   unsigned ptWidth, bindings;
+   uint16_t ptHeight, ptDepth, ptLayers;
    enum pipe_format fmt;
    GLint level;
    GLuint num_samples = texImage->NumSamples;
 
    assert(levels > 0);
 
    stObj->lastLevel = levels - 1;
 
    fmt = st_mesa_format_to_pipe_format(st, texImage->TexFormat);
 
diff --git a/src/mesa/state_tracker/st_texture.c b/src/mesa/state_tracker/st_texture.c
index 7b72ffd..2e9856d 100644
--- a/src/mesa/state_tracker/st_texture.c
+++ b/src/mesa/state_tracker/st_texture.c
@@ -104,27 +104,27 @@ st_texture_create(struct st_context *st,
 
 
 /**
  * In OpenGL the number of 1D array texture layers is the "height" and
  * the number of 2D array texture layers is the "depth".  In Gallium the
  * number of layers in an array texture is a separate 'array_size' field.
  * This function converts dimensions from the former to the later.
  */
 void
 st_gl_texture_dims_to_pipe_dims(GLenum texture,
-                                GLuint widthIn,
-                                GLuint heightIn,
-                                GLuint depthIn,
-                                GLuint *widthOut,
-                                GLuint *heightOut,
-                                GLuint *depthOut,
-                                GLuint *layersOut)
+                                unsigned widthIn,
+                                uint16_t heightIn,
+                                uint16_t depthIn,
+                                unsigned *widthOut,
+                                uint16_t *heightOut,
+                                uint16_t *depthOut,
+                                uint16_t *layersOut)
 {
    switch (texture) {
    case GL_TEXTURE_1D:
    case GL_PROXY_TEXTURE_1D:
       assert(heightIn == 1);
       assert(depthIn == 1);
       *widthOut = widthIn;
       *heightOut = 1;
       *depthOut = 1;
       *layersOut = 1;
@@ -195,21 +195,22 @@ st_gl_texture_dims_to_pipe_dims(GLenum texture,
 
 
 /**
  * Check if a texture image can be pulled into a unified mipmap texture.
  */
 GLboolean
 st_texture_match_image(struct st_context *st,
                        const struct pipe_resource *pt,
                        const struct gl_texture_image *image)
 {
-   GLuint ptWidth, ptHeight, ptDepth, ptLayers;
+   unsigned ptWidth;
+   uint16_t ptHeight, ptDepth, ptLayers;
 
    /* Images with borders are never pulled into mipmap textures. 
     */
    if (image->Border) 
       return GL_FALSE;
 
    /* Check if this image's format matches the established texture's format.
     */
    if (st_mesa_format_to_pipe_format(st, image->TexFormat) != pt->format)
       return GL_FALSE;
diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h
index 0ce7989..f797445 100644
--- a/src/mesa/state_tracker/st_texture.h
+++ b/src/mesa/state_tracker/st_texture.h
@@ -195,27 +195,27 @@ st_texture_create(struct st_context *st,
                   GLuint width0,
                   GLuint height0,
                   GLuint depth0,
                   GLuint layers,
                   GLuint nr_samples,
                   GLuint tex_usage );
 
 
 extern void
 st_gl_texture_dims_to_pipe_dims(GLenum texture,
-                                GLuint widthIn,
-                                GLuint heightIn,
-                                GLuint depthIn,
-                                GLuint *widthOut,
-                                GLuint *heightOut,
-                                GLuint *depthOut,
-                                GLuint *layersOut);
+                                unsigned widthIn,
+                                uint16_t heightIn,
+                                uint16_t depthIn,
+                                unsigned *widthOut,
+                                uint16_t *heightOut,
+                                uint16_t *depthOut,
+                                uint16_t *layersOut);
 
 /* Check if an image fits into an existing texture object.
  */
 extern GLboolean
 st_texture_match_image(struct st_context *st,
                        const struct pipe_resource *pt,
                        const struct gl_texture_image *image);
 
 /* Return a pointer to an image within a texture.  Return image stride as
  * well.
-- 
2.7.4



More information about the mesa-dev mailing list