Subversion Repositories Kolibri OS

Rev

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

  1. /*
  2.  * Copyright © 2012 Intel Corporation
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  21.  * DEALINGS IN THE SOFTWARE.
  22.  */
  23. #include <gtest/gtest.h>
  24. #include "main/mtypes.h"
  25. #include "main/macros.h"
  26. #include "ralloc.h"
  27. #include "uniform_initializer_utils.h"
  28. #include <stdio.h>
  29.  
  30. void
  31. fill_storage_array_with_sentinels(gl_constant_value *storage,
  32.                                   unsigned data_size,
  33.                                   unsigned red_zone_size)
  34. {
  35.    for (unsigned i = 0; i < data_size; i++)
  36.       storage[i].u = 0xDEADBEEF;
  37.  
  38.    for (unsigned i = 0; i < red_zone_size; i++)
  39.       storage[data_size + i].u = 0xBADDC0DE;
  40. }
  41.  
  42. /**
  43.  * Verfiy that markers past the end of the real uniform are unmodified
  44.  */
  45. static ::testing::AssertionResult
  46. red_zone_is_intact(gl_constant_value *storage,
  47.                    unsigned data_size,
  48.                    unsigned red_zone_size)
  49. {
  50.    for (unsigned i = 0; i < red_zone_size; i++) {
  51.       const unsigned idx = data_size + i;
  52.  
  53.       if (storage[idx].u != 0xBADDC0DE)
  54.          return ::testing::AssertionFailure()
  55.             << "storage[" << idx << "].u = "  << storage[idx].u
  56.             << ", exepected data values = " << data_size
  57.             << ", red-zone size = " << red_zone_size;
  58.    }
  59.  
  60.    return ::testing::AssertionSuccess();
  61. }
  62.  
  63. static const int values[] = {
  64.    2, 0, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53
  65. };
  66.  
  67. /**
  68.  * Generate a single data element.
  69.  *
  70.  * This is by both \c generate_data and \c generate_array_data to create the
  71.  * data.
  72.  */
  73. static void
  74. generate_data_element(void *mem_ctx, const glsl_type *type,
  75.                       ir_constant *&val, unsigned data_index_base)
  76. {
  77.    /* Set the initial data values for the generated constant.
  78.     */
  79.    ir_constant_data data;
  80.    memset(&data, 0, sizeof(data));
  81.    for (unsigned i = 0; i < type->components(); i++) {
  82.       const unsigned idx = (i + data_index_base) % Elements(values);
  83.       switch (type->base_type) {
  84.       case GLSL_TYPE_UINT:
  85.       case GLSL_TYPE_INT:
  86.       case GLSL_TYPE_SAMPLER:
  87.          data.i[i] = values[idx];
  88.          break;
  89.       case GLSL_TYPE_FLOAT:
  90.          data.f[i] = float(values[idx]);
  91.          break;
  92.       case GLSL_TYPE_BOOL:
  93.          data.b[i] = bool(values[idx]);
  94.          break;
  95.       case GLSL_TYPE_STRUCT:
  96.       case GLSL_TYPE_ARRAY:
  97.       case GLSL_TYPE_VOID:
  98.       case GLSL_TYPE_ERROR:
  99.       case GLSL_TYPE_INTERFACE:
  100.          ASSERT_TRUE(false);
  101.          break;
  102.       }
  103.    }
  104.  
  105.    /* Generate and verify the constant.
  106.     */
  107.    val = new(mem_ctx) ir_constant(type, &data);
  108.  
  109.    for (unsigned i = 0; i < type->components(); i++) {
  110.       switch (type->base_type) {
  111.       case GLSL_TYPE_UINT:
  112.       case GLSL_TYPE_INT:
  113.       case GLSL_TYPE_SAMPLER:
  114.          ASSERT_EQ(data.i[i], val->value.i[i]);
  115.          break;
  116.       case GLSL_TYPE_FLOAT:
  117.          ASSERT_EQ(data.f[i], val->value.f[i]);
  118.          break;
  119.       case GLSL_TYPE_BOOL:
  120.          ASSERT_EQ(data.b[i], val->value.b[i]);
  121.          break;
  122.       case GLSL_TYPE_STRUCT:
  123.       case GLSL_TYPE_ARRAY:
  124.       case GLSL_TYPE_VOID:
  125.       case GLSL_TYPE_ERROR:
  126.       case GLSL_TYPE_INTERFACE:
  127.          ASSERT_TRUE(false);
  128.          break;
  129.       }
  130.    }
  131. }
  132.  
  133. void
  134. generate_data(void *mem_ctx, enum glsl_base_type base_type,
  135.               unsigned columns, unsigned rows,
  136.               ir_constant *&val)
  137. {
  138.    /* Determine what the type of the generated constant should be.
  139.     */
  140.    const glsl_type *const type =
  141.       glsl_type::get_instance(base_type, rows, columns);
  142.    ASSERT_FALSE(type->is_error());
  143.  
  144.    generate_data_element(mem_ctx, type, val, 0);
  145. }
  146.  
  147. void
  148. generate_array_data(void *mem_ctx, enum glsl_base_type base_type,
  149.                     unsigned columns, unsigned rows, unsigned array_size,
  150.                     ir_constant *&val)
  151. {
  152.    /* Determine what the type of the generated constant should be.
  153.     */
  154.    const glsl_type *const element_type =
  155.       glsl_type::get_instance(base_type, rows, columns);
  156.    ASSERT_FALSE(element_type->is_error());
  157.  
  158.    const glsl_type *const array_type =
  159.       glsl_type::get_array_instance(element_type, array_size);
  160.    ASSERT_FALSE(array_type->is_error());
  161.  
  162.    /* Set the initial data values for the generated constant.
  163.     */
  164.    exec_list values_for_array;
  165.    for (unsigned i = 0; i < array_size; i++) {
  166.       ir_constant *element;
  167.  
  168.       generate_data_element(mem_ctx, element_type, element, i);
  169.       values_for_array.push_tail(element);
  170.    }
  171.  
  172.    val = new(mem_ctx) ir_constant(array_type, &values_for_array);
  173. }
  174.  
  175. /**
  176.  * Verify that the data stored for the uniform matches the initializer
  177.  *
  178.  * \param storage              Backing storage for the uniform
  179.  * \param storage_array_size  Array size of the backing storage.  This must be
  180.  *                            less than or equal to the array size of the type
  181.  *                            of \c val.  If \c val is not an array, this must
  182.  *                            be zero.
  183.  * \param val                 Value of the initializer for the unifrom.
  184.  * \param red_zone
  185.  */
  186. void
  187. verify_data(gl_constant_value *storage, unsigned storage_array_size,
  188.             ir_constant *val, unsigned red_zone_size)
  189. {
  190.    if (val->type->base_type == GLSL_TYPE_ARRAY) {
  191.       const glsl_type *const element_type = val->array_elements[0]->type;
  192.  
  193.       for (unsigned i = 0; i < storage_array_size; i++) {
  194.          verify_data(storage + (i * element_type->components()), 0,
  195.                      val->array_elements[i], 0);
  196.       }
  197.  
  198.       const unsigned components = element_type->components();
  199.  
  200.       if (red_zone_size > 0) {
  201.          EXPECT_TRUE(red_zone_is_intact(storage,
  202.                                         storage_array_size * components,
  203.                                         red_zone_size));
  204.       }
  205.    } else {
  206.       ASSERT_EQ(0u, storage_array_size);
  207.       for (unsigned i = 0; i < val->type->components(); i++) {
  208.          switch (val->type->base_type) {
  209.          case GLSL_TYPE_UINT:
  210.          case GLSL_TYPE_INT:
  211.          case GLSL_TYPE_SAMPLER:
  212.             EXPECT_EQ(val->value.i[i], storage[i].i);
  213.             break;
  214.          case GLSL_TYPE_FLOAT:
  215.             EXPECT_EQ(val->value.f[i], storage[i].f);
  216.             break;
  217.          case GLSL_TYPE_BOOL:
  218.             EXPECT_EQ(int(val->value.b[i]), storage[i].i);
  219.             break;
  220.          case GLSL_TYPE_STRUCT:
  221.          case GLSL_TYPE_ARRAY:
  222.          case GLSL_TYPE_VOID:
  223.          case GLSL_TYPE_ERROR:
  224.          case GLSL_TYPE_INTERFACE:
  225.             ASSERT_TRUE(false);
  226.             break;
  227.          }
  228.       }
  229.  
  230.       if (red_zone_size > 0) {
  231.          EXPECT_TRUE(red_zone_is_intact(storage,
  232.                                         val->type->components(),
  233.                                         red_zone_size));
  234.       }
  235.    }
  236. }
  237.