Subversion Repositories Kolibri OS

Rev

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

  1. /* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
  2.  
  3. /*
  4.  * Copyright (C) 2013 Rob Clark <robclark@freedesktop.org>
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the "Software"),
  8.  * to deal in the Software without restriction, including without limitation
  9.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10.  * and/or sell copies of the Software, and to permit persons to whom the
  11.  * Software is furnished to do so, subject to the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice (including the next
  14.  * paragraph) shall be included in all copies or substantial portions of the
  15.  * Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22.  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  23.  * SOFTWARE.
  24.  *
  25.  * Authors:
  26.  *    Rob Clark <robclark@freedesktop.org>
  27.  */
  28.  
  29. #include "pipe/p_state.h"
  30. #include "util/u_string.h"
  31. #include "util/u_memory.h"
  32. #include "util/u_inlines.h"
  33.  
  34. #include "fd3_texture.h"
  35. #include "fd3_util.h"
  36.  
  37. static enum a3xx_tex_clamp
  38. tex_clamp(unsigned wrap)
  39. {
  40.         /* hardware probably supports more, but we can't coax all the
  41.          * wrap/clamp modes out of the GLESv2 blob driver.
  42.          *
  43.          * TODO once we have basics working, go back and just try
  44.          * different values and see what happens
  45.          */
  46.         switch (wrap) {
  47.         case PIPE_TEX_WRAP_REPEAT:
  48.                 return A3XX_TEX_REPEAT;
  49.         case PIPE_TEX_WRAP_CLAMP:
  50.         case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
  51.         case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
  52.                 return A3XX_TEX_CLAMP_TO_EDGE;
  53.         case PIPE_TEX_WRAP_MIRROR_CLAMP:
  54.         case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
  55.         case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
  56.         case PIPE_TEX_WRAP_MIRROR_REPEAT:
  57.                 return A3XX_TEX_MIRROR_REPEAT;
  58.         default:
  59.                 DBG("invalid wrap: %u", wrap);
  60.                 return 0;
  61.         }
  62. }
  63.  
  64. static enum a3xx_tex_filter
  65. tex_filter(unsigned filter)
  66. {
  67.         switch (filter) {
  68.         case PIPE_TEX_FILTER_NEAREST:
  69.                 return A3XX_TEX_NEAREST;
  70.         case PIPE_TEX_FILTER_LINEAR:
  71.                 return A3XX_TEX_LINEAR;
  72.         default:
  73.                 DBG("invalid filter: %u", filter);
  74.                 return 0;
  75.         }
  76. }
  77.  
  78. static void *
  79. fd3_sampler_state_create(struct pipe_context *pctx,
  80.                 const struct pipe_sampler_state *cso)
  81. {
  82.         struct fd3_sampler_stateobj *so = CALLOC_STRUCT(fd3_sampler_stateobj);
  83.  
  84.         if (!so)
  85.                 return NULL;
  86.  
  87.         so->base = *cso;
  88.  
  89.         so->texsamp0 =
  90.                         A3XX_TEX_SAMP_0_XY_MAG(tex_filter(cso->mag_img_filter)) |
  91.                         A3XX_TEX_SAMP_0_XY_MIN(tex_filter(cso->min_img_filter)) |
  92.                         A3XX_TEX_SAMP_0_WRAP_S(tex_clamp(cso->wrap_s)) |
  93.                         A3XX_TEX_SAMP_0_WRAP_T(tex_clamp(cso->wrap_t)) |
  94.                         A3XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r));
  95.         so->texsamp1 = 0x00000000;  /* ??? */
  96.  
  97.         return so;
  98. }
  99.  
  100. static struct pipe_sampler_view *
  101. fd3_sampler_view_create(struct pipe_context *pctx, struct pipe_resource *prsc,
  102.                 const struct pipe_sampler_view *cso)
  103. {
  104.         struct fd3_pipe_sampler_view *so = CALLOC_STRUCT(fd3_pipe_sampler_view);
  105.         struct fd_resource *rsc = fd_resource(prsc);
  106.  
  107.         if (!so)
  108.                 return NULL;
  109.  
  110.         so->base = *cso;
  111.         pipe_reference(NULL, &prsc->reference);
  112.         so->base.texture = prsc;
  113.         so->base.reference.count = 1;
  114.         so->base.context = pctx;
  115.  
  116.         so->tex_resource =  rsc;
  117.  
  118.         so->texconst0 =
  119.                         0x40000000 | /* ??? */
  120.                         A3XX_TEX_CONST_0_FMT(fd3_pipe2tex(cso->format)) |
  121.                         fd3_tex_swiz(cso->format, cso->swizzle_r, cso->swizzle_g,
  122.                                                 cso->swizzle_b, cso->swizzle_a);
  123.         so->texconst1 =
  124.                         A3XX_TEX_CONST_1_FETCHSIZE(fd3_pipe2fetchsize(cso->format)) |
  125.                         A3XX_TEX_CONST_1_WIDTH(prsc->width0) |
  126.                         A3XX_TEX_CONST_1_HEIGHT(prsc->height0);
  127.         /* when emitted, A3XX_TEX_CONST_2_INDX() must be OR'd in: */
  128.         so->texconst2 =
  129.                         A3XX_TEX_CONST_2_PITCH(rsc->pitch * rsc->cpp);
  130.         so->texconst3 = 0x00000000;  /* ??? */
  131.  
  132.         return &so->base;
  133. }
  134.  
  135. void
  136. fd3_texture_init(struct pipe_context *pctx)
  137. {
  138.         pctx->create_sampler_state = fd3_sampler_state_create;
  139.         pctx->create_sampler_view = fd3_sampler_view_create;
  140. }
  141.