ilo: add ilo_state_sbe

We want to replace ilo_kernel_routing with ilo_state_sbe.
This commit is contained in:
Chia-I Wu
2015-06-12 14:02:37 +08:00
parent 1ccab943b6
commit a0bb1c2d17
3 changed files with 455 additions and 0 deletions
+2
View File
@@ -29,6 +29,8 @@ C_SOURCES := \
core/ilo_state_raster.h \
core/ilo_state_sampler.c \
core/ilo_state_sampler.h \
core/ilo_state_sbe.c \
core/ilo_state_sbe.h \
core/ilo_state_sol.c \
core/ilo_state_sol.h \
core/ilo_state_surface.c \
@@ -0,0 +1,350 @@
/*
* Mesa 3-D graphics library
*
* Copyright (C) 2012-2015 LunarG, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Authors:
* Chia-I Wu <olv@lunarg.com>
*/
#include "ilo_debug.h"
#include "ilo_state_sbe.h"
static bool
sbe_validate_gen8(const struct ilo_dev *dev,
const struct ilo_state_sbe_info *info)
{
ILO_DEV_ASSERT(dev, 6, 8);
assert(info->attr_count <= ILO_STATE_SBE_MAX_ATTR_COUNT);
assert(info->vue_read_base + info->vue_read_count <=
info->cv_vue_attr_count);
/*
* From the Sandy Bridge PRM, volume 2 part 1, page 248:
*
* "(Vertex URB Entry Read Length)
* Format: U5
* Range [1,16]
*
* Specifies the amount of URB data read for each Vertex URB entry, in
* 256-bit register increments.
*
* Programming Notes
* It is UNDEFINED to set this field to 0 indicating no Vertex URB
* data to be read."
*
* "(Vertex URB Entry Read Offset)
* Format: U6
* Range [0,63]
*
* Specifies the offset (in 256-bit units) at which Vertex URB data is
* to be read from the URB."
*/
assert(info->vue_read_base % 2 == 0 && info->vue_read_base <= 126);
assert(info->vue_read_count <= 32);
/*
* From the Ivy Bridge PRM, volume 2 part 1, page 268:
*
* "This field (Point Sprite Texture Coordinate Enable) must be
* programmed to 0 when non-point primitives are rendered."
*/
if (ilo_dev_gen(dev) < ILO_GEN(7.5) && info->point_sprite_enables)
assert(info->cv_is_point);
/*
* From the Sandy Bridge PRM, volume 2 part 1, page 246:
*
* "(Number of SF Output Attributes) 33-48: Specifies 17-32 attributes
* (# attributes = field value - 16). Swizzling performed on
* Attributes 16-31 (as required) only. Attributes 0-15 passed through
* unmodified.
*
* Note :
*
* Attribute n Component Override and Constant Source states apply to
* Attributes 16-31 (as required) instead of Attributes 0-15. E.g.,
* this allows an Attribute 16-31 component to be overridden with the
* PrimitiveID value.
*
* Attribute n WrapShortest Enables still apply to Attributes 0-15.
*
* Attribute n Swizzle Select and Attribute n Source Attribute states
* are ignored and none of the swizzling functions available through
* these controls are performed."
*
* From the Sandy Bridge PRM, volume 2 part 1, page 247:
*
* "This bit (Attribute Swizzle Enable) controls the use of the
* Attribute n Swizzle Select and Attribute n Source Attribute fields
* only. If ENABLED, those fields are used as described below. If
* DISABLED, attributes are copied from their corresponding source
* attributes, for the purposes of Swizzle Select only.
*
* Note that the following fields are unaffected by this bit, and are
* therefore always used to control their respective fields:
* Attribute n Component Override X/Y/Z/W
* Attribute n Constant Source
* Attribute n WrapShortest Enables"
*
* From the Ivy Bridge PRM, volume 2 part 1, page 264:
*
* "When Attribute Swizzle Enable is ENABLED, this bit (Attribute
* Swizzle Control Mode) controls whether attributes 0-15 or 16-31 are
* subject to the following swizzle controls:
*
* - Attribute n Component Override X/Y/Z/W
* - Attribute n Constant Source
* - Attribute n Swizzle Select
* - Attribute n Source Attribute
* - Attribute n Wrap Shortest Enables"
*
* "SWIZ_16_31... Only valid when 16 or more attributes are output."
*/
assert(info->swizzle_count <= ILO_STATE_SBE_MAX_SWIZZLE_COUNT);
if (info->swizzle_16_31) {
assert(ilo_dev_gen(dev) >= ILO_GEN(7) &&
info->swizzle_enable &&
info->attr_count > 16);
}
return true;
}
static uint8_t
sbe_get_gen8_min_read_count(const struct ilo_dev *dev,
const struct ilo_state_sbe_info *info)
{
uint8_t min_count = 0;
ILO_DEV_ASSERT(dev, 6, 8);
/* minimum read count for non-swizzled attributes */
if (!info->swizzle_enable || info->swizzle_count < info->attr_count) {
if (info->swizzle_16_31 && info->swizzle_count + 16 == info->attr_count)
min_count = 16;
else
min_count = info->attr_count;
}
if (info->swizzle_enable) {
uint8_t i;
for (i = 0; i < info->swizzle_count; i++) {
const struct ilo_state_sbe_swizzle_info *swizzle =
&info->swizzles[i];
bool inputattr_facing;
switch (swizzle->attr_select) {
case GEN6_INPUTATTR_FACING:
case GEN6_INPUTATTR_FACING_W:
inputattr_facing = true;
break;
default:
inputattr_facing = false;
break;
}
if (min_count < swizzle->attr + inputattr_facing + 1)
min_count = swizzle->attr + inputattr_facing + 1;
}
}
return min_count;
}
static uint8_t
sbe_get_gen8_read_length(const struct ilo_dev *dev,
const struct ilo_state_sbe_info *info)
{
uint8_t read_len;
ILO_DEV_ASSERT(dev, 6, 8);
/*
* From the Sandy Bridge PRM, volume 2 part 1, page 248:
*
* "(Vertex URB Entry Read Length)
* This field should be set to the minimum length required to read the
* maximum source attribute. The maximum source attribute is indicated
* by the maximum value of the enabled Attribute # Source Attribute if
* Attribute Swizzle Enable is set, Number of Output Attributes -1 if
* enable is not set.
* read_length = ceiling((max_source_attr+1)/2)
*
* [errata] Corruption/Hang possible if length programmed larger than
* recommended"
*/
if (info->has_min_read_count) {
read_len = info->vue_read_count;
assert(read_len == sbe_get_gen8_min_read_count(dev, info));
} else {
read_len = sbe_get_gen8_min_read_count(dev, info);
assert(read_len <= info->vue_read_count);
}
/*
* In pairs. URB entries are aligned to 1024-bits or 512-bits. There is
* no need to worry about reading past entries.
*/
read_len = (read_len + 1) / 2;
if (!read_len)
read_len = 1;
return read_len;
}
static bool
sbe_set_gen8_3DSTATE_SBE(struct ilo_state_sbe *sbe,
const struct ilo_dev *dev,
const struct ilo_state_sbe_info *info)
{
uint8_t vue_read_offset, vue_read_len;
uint8_t attr_count;
uint32_t dw1, dw2, dw3;
ILO_DEV_ASSERT(dev, 6, 8);
if (!sbe_validate_gen8(dev, info))
return false;
vue_read_offset = info->vue_read_base / 2;
vue_read_len = sbe_get_gen8_read_length(dev, info);
attr_count = info->attr_count;
if (ilo_dev_gen(dev) == ILO_GEN(6) && info->swizzle_16_31)
attr_count += 16;
dw1 = attr_count << GEN7_SBE_DW1_ATTR_COUNT__SHIFT |
vue_read_len << GEN7_SBE_DW1_URB_READ_LEN__SHIFT;
if (ilo_dev_gen(dev) >= ILO_GEN(8)) {
dw1 |= GEN8_SBE_DW1_USE_URB_READ_LEN |
GEN8_SBE_DW1_USE_URB_READ_OFFSET |
vue_read_offset << GEN8_SBE_DW1_URB_READ_OFFSET__SHIFT;
} else {
dw1 |= vue_read_offset << GEN7_SBE_DW1_URB_READ_OFFSET__SHIFT;
}
if (ilo_dev_gen(dev) >= ILO_GEN(7) && info->swizzle_16_31)
dw1 |= GEN7_SBE_DW1_ATTR_SWIZZLE_16_31;
if (info->swizzle_enable)
dw1 |= GEN7_SBE_DW1_ATTR_SWIZZLE_ENABLE;
dw1 |= (info->point_sprite_origin_lower_left) ?
GEN7_SBE_DW1_POINT_SPRITE_TEXCOORD_LOWERLEFT :
GEN7_SBE_DW1_POINT_SPRITE_TEXCOORD_UPPERLEFT;
dw2 = info->point_sprite_enables;
dw3 = info->const_interp_enables;
STATIC_ASSERT(ARRAY_SIZE(sbe->sbe) >= 3);
sbe->sbe[0] = dw1;
sbe->sbe[1] = dw2;
sbe->sbe[2] = dw3;
return true;
}
static bool
sbe_set_gen8_3DSTATE_SBE_SWIZ(struct ilo_state_sbe *sbe,
const struct ilo_dev *dev,
const struct ilo_state_sbe_info *info)
{
uint16_t swiz[ILO_STATE_SBE_MAX_SWIZZLE_COUNT];
uint8_t i;
ILO_DEV_ASSERT(dev, 6, 8);
for (i = 0; i < info->swizzle_count; i++) {
const struct ilo_state_sbe_swizzle_info *swizzle = &info->swizzles[i];
/* U5 */
assert(swizzle->attr < 32);
swiz[i] = swizzle->attr_select << GEN8_SBE_SWIZ_SWIZZLE_SELECT__SHIFT |
swizzle->attr << GEN8_SBE_SWIZ_SRC_ATTR__SHIFT;
if (swizzle->force_zeros) {
swiz[i] |= GEN8_SBE_SWIZ_OVERRIDE_W |
GEN8_SBE_SWIZ_OVERRIDE_Z |
GEN8_SBE_SWIZ_OVERRIDE_Y |
GEN8_SBE_SWIZ_OVERRIDE_X |
GEN8_SBE_SWIZ_CONST_0000;
}
}
for (; i < ARRAY_SIZE(swiz); i++) {
swiz[i] = GEN6_INPUTATTR_NORMAL << GEN8_SBE_SWIZ_SWIZZLE_SELECT__SHIFT |
i << GEN8_SBE_SWIZ_SRC_ATTR__SHIFT;
}
STATIC_ASSERT(sizeof(sbe->swiz) == sizeof(swiz));
memcpy(sbe->swiz, swiz, sizeof(swiz));
return true;
}
bool
ilo_state_sbe_init(struct ilo_state_sbe *sbe,
const struct ilo_dev *dev,
const struct ilo_state_sbe_info *info)
{
assert(ilo_is_zeroed(sbe, sizeof(*sbe)));
return ilo_state_sbe_set_info(sbe, dev, info);
}
bool
ilo_state_sbe_init_for_rectlist(struct ilo_state_sbe *sbe,
const struct ilo_dev *dev,
uint8_t read_base,
uint8_t read_count)
{
struct ilo_state_sbe_info info;
memset(&info, 0, sizeof(info));
info.attr_count = read_count;
info.cv_vue_attr_count = read_base + read_count;
info.vue_read_base = read_base;
info.vue_read_count = read_count;
info.has_min_read_count = true;
return ilo_state_sbe_set_info(sbe, dev, &info);
}
bool
ilo_state_sbe_set_info(struct ilo_state_sbe *sbe,
const struct ilo_dev *dev,
const struct ilo_state_sbe_info *info)
{
bool ret = true;
ILO_DEV_ASSERT(dev, 6, 8);
ret &= sbe_set_gen8_3DSTATE_SBE(sbe, dev, info);
ret &= sbe_set_gen8_3DSTATE_SBE_SWIZ(sbe, dev, info);
assert(ret);
return true;
}
@@ -0,0 +1,103 @@
/*
* Mesa 3-D graphics library
*
* Copyright (C) 2015 LunarG, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Authors:
* Chia-I Wu <olv@lunarg.com>
*/
#ifndef ILO_STATE_SBE_H
#define ILO_STATE_SBE_H
#include "genhw/genhw.h"
#include "ilo_core.h"
#include "ilo_dev.h"
/*
* From the Sandy Bridge PRM, volume 2 part 1, page 264:
*
* "Number of SF Output Attributes sets the number of attributes that will
* be output from the SF stage, not including position. This can be used
* to specify up to 32, and may differ from the number of input
* attributes."
*
* "The first or last set of 16 attributes can be swizzled according to
* certain state fields."
*/
#define ILO_STATE_SBE_MAX_ATTR_COUNT 32
#define ILO_STATE_SBE_MAX_SWIZZLE_COUNT 16
struct ilo_state_sbe_swizzle_info {
/* select an attribute from read ones */
enum gen_inputattr_select attr_select;
uint8_t attr;
bool force_zeros;
};
struct ilo_state_sbe_info {
uint8_t attr_count;
/* which VUE attributes to read */
uint8_t cv_vue_attr_count;
uint8_t vue_read_base;
uint8_t vue_read_count;
bool has_min_read_count;
bool cv_is_point;
bool point_sprite_origin_lower_left;
/* force sprite coordinates to the four corner vertices of the point */
uint32_t point_sprite_enables;
/* force attr at the provoking vertex to a0 and zero to a1/a2 */
uint32_t const_interp_enables;
bool swizzle_enable;
/* swizzle attribute 16 to 31 instead; Gen7+ only */
bool swizzle_16_31;
uint8_t swizzle_count;
const struct ilo_state_sbe_swizzle_info *swizzles;
};
struct ilo_state_sbe {
uint32_t sbe[3];
uint32_t swiz[8];
};
bool
ilo_state_sbe_init(struct ilo_state_sbe *sbe,
const struct ilo_dev *dev,
const struct ilo_state_sbe_info *info);
bool
ilo_state_sbe_init_for_rectlist(struct ilo_state_sbe *sbe,
const struct ilo_dev *dev,
uint8_t read_base,
uint8_t read_count);
bool
ilo_state_sbe_set_info(struct ilo_state_sbe *sbe,
const struct ilo_dev *dev,
const struct ilo_state_sbe_info *info);
#endif /* ILO_STATE_SBE_H */