Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2010 VMware, Inc.
  4.  * All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the
  8.  * "Software"), to deal in the Software without restriction, including
  9.  * without limitation the rights to use, copy, modify, merge, publish,
  10.  * distribute, sub license, and/or sell copies of the Software, and to
  11.  * permit persons to whom the Software is furnished to do so, subject to
  12.  * the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice (including the
  15.  * next paragraph) shall be included in all copies or substantial portions
  16.  * of the Software.
  17.  *
  18.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  19.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  20.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  21.  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  22.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  23.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  24.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.  *
  26.  **************************************************************************/
  27.  
  28.  
  29. #include "u_format.h"
  30. #include "u_sampler.h"
  31.  
  32.  
  33. /**
  34.  * Initialize a pipe_sampler_view.  'view' is considered to have
  35.  * uninitialized contents.
  36.  */
  37. static void
  38. default_template(struct pipe_sampler_view *view,
  39.                  const struct pipe_resource *texture,
  40.                  enum pipe_format format,
  41.                  unsigned expand_green_blue)
  42. {
  43.    memset(view, 0, sizeof(*view));
  44.  
  45.    /* XXX: Check if format is compatible with texture->format.
  46.     */
  47.  
  48.    view->format = format;
  49.    view->u.tex.first_level = 0;
  50.    view->u.tex.last_level = texture->last_level;
  51.    view->u.tex.first_layer = 0;
  52.    view->u.tex.last_layer = texture->target == PIPE_TEXTURE_3D ?
  53.                                texture->depth0 - 1 : texture->array_size - 1;
  54.    view->swizzle_r = PIPE_SWIZZLE_RED;
  55.    view->swizzle_g = PIPE_SWIZZLE_GREEN;
  56.    view->swizzle_b = PIPE_SWIZZLE_BLUE;
  57.    view->swizzle_a = PIPE_SWIZZLE_ALPHA;
  58.  
  59.    /* Override default green and blue component expansion to the requested
  60.     * one.
  61.     *
  62.     * Gallium expands nonexistent components to (0,0,0,1), DX9 expands
  63.     * to (1,1,1,1).  Since alpha is always expanded to 1, and red is
  64.     * always present, we only really care about green and blue
  65.     * components.
  66.     *
  67.     * To make it look less hackish, one would have to add
  68.     * UTIL_FORMAT_SWIZZLE_EXPAND to indicate components for expansion
  69.     * and then override without exceptions or favoring one component
  70.     * over another.
  71.     */
  72.    if (format != PIPE_FORMAT_A8_UNORM) {
  73.       const struct util_format_description *desc = util_format_description(format);
  74.  
  75.       assert(desc);
  76.       if (desc) {
  77.          if (desc->swizzle[1] == UTIL_FORMAT_SWIZZLE_0) {
  78.             view->swizzle_g = expand_green_blue;
  79.          }
  80.          if (desc->swizzle[2] == UTIL_FORMAT_SWIZZLE_0) {
  81.             view->swizzle_b = expand_green_blue;
  82.          }
  83.       }
  84.    }
  85. }
  86.  
  87. void
  88. u_sampler_view_default_template(struct pipe_sampler_view *view,
  89.                                 const struct pipe_resource *texture,
  90.                                 enum pipe_format format)
  91. {
  92.    /* Expand to (0, 0, 0, 1) */
  93.    default_template(view,
  94.                     texture,
  95.                     format,
  96.                     PIPE_SWIZZLE_ZERO);
  97. }
  98.  
  99. void
  100. u_sampler_view_default_dx9_template(struct pipe_sampler_view *view,
  101.                                     const struct pipe_resource *texture,
  102.                                     enum pipe_format format)
  103. {
  104.    /* Expand to (1, 1, 1, 1) */
  105.    default_template(view,
  106.                     texture,
  107.                     format,
  108.                     PIPE_SWIZZLE_ONE);
  109. }
  110.