ilo: replace pipe_texture_target by gen_surface_type

Replace pipe_texture_target by gen_surface_type in ilo_image.  Change how
GEN6_SURFTYPE_CUBE is specified in ilo_state_surface and ilo_state_zs.
This commit is contained in:
Chia-I Wu 2015-06-24 22:47:30 +08:00
parent 934e4a469f
commit dc2e92b2d3
8 changed files with 99 additions and 126 deletions

View File

@ -514,7 +514,7 @@ img_init_walk_gen7(struct ilo_image *img,
* "note that the depth buffer and stencil buffer have an implied
* value of ARYSPC_FULL"
*/
img->walk = (info->target == PIPE_TEXTURE_3D) ?
img->walk = (info->type == GEN6_SURFTYPE_3D) ?
ILO_IMAGE_WALK_3D : ILO_IMAGE_WALK_LAYER;
img->interleaved_samples = true;
@ -533,7 +533,7 @@ img_init_walk_gen7(struct ilo_image *img,
assert(info->level_count == 1);
img->walk =
(info->target == PIPE_TEXTURE_3D) ? ILO_IMAGE_WALK_3D :
(info->type == GEN6_SURFTYPE_3D) ? ILO_IMAGE_WALK_3D :
(info->level_count > 1) ? ILO_IMAGE_WALK_LAYER :
ILO_IMAGE_WALK_LOD;
@ -557,7 +557,7 @@ img_init_walk_gen6(struct ilo_image *img,
* GEN6 does not support compact spacing otherwise.
*/
img->walk =
(params->info->target == PIPE_TEXTURE_3D) ? ILO_IMAGE_WALK_3D :
(params->info->type == GEN6_SURFTYPE_3D) ? ILO_IMAGE_WALK_3D :
(img->format == PIPE_FORMAT_S8_UINT) ? ILO_IMAGE_WALK_LOD :
ILO_IMAGE_WALK_LAYER;
@ -674,7 +674,7 @@ img_init_size_and_format(struct ilo_image *img,
enum pipe_format format = info->format;
bool require_separate_stencil = false;
img->target = info->target;
img->type = info->type;
img->width0 = info->width;
img->height0 = info->height;
img->depth0 = info->depth;
@ -737,7 +737,7 @@ img_want_mcs(const struct ilo_image *img,
if (ilo_dev_gen(params->dev) < ILO_GEN(7))
return false;
if (info->target != PIPE_TEXTURE_2D || !info->bind_surface_dp_render)
if (info->type != GEN6_SURFTYPE_2D || !info->bind_surface_dp_render)
return false;
/*
@ -799,7 +799,7 @@ img_want_hiz(const struct ilo_image *img,
return false;
/* we want 8x4 aligned levels */
if (info->target == PIPE_TEXTURE_1D)
if (info->type == GEN6_SURFTYPE_1D)
return false;
if (!info->bind_zs)
@ -865,7 +865,7 @@ img_align(struct ilo_image *img, struct ilo_image_params *params)
align_w = MAX2(align_w, img->align_i);
align_h = MAX2(align_h, img->align_j);
if (info->target == PIPE_TEXTURE_CUBE)
if (info->type == GEN6_SURFTYPE_CUBE)
pad_h += 2;
if (params->compressed)
@ -1339,7 +1339,7 @@ img_init_for_transfer(struct ilo_image *img,
const struct ilo_dev *dev,
const struct ilo_image_info *info)
{
const unsigned num_layers = (info->target == PIPE_TEXTURE_3D) ?
const unsigned num_layers = (info->type == GEN6_SURFTYPE_3D) ?
info->depth : info->array_size;
unsigned layer_width, layer_height;
@ -1348,7 +1348,7 @@ img_init_for_transfer(struct ilo_image *img,
img->aux.type = ILO_IMAGE_AUX_NONE;
img->target = info->target;
img->type = info->type;
img->width0 = info->width;
img->height0 = info->height;
img->depth0 = info->depth;

View File

@ -68,7 +68,7 @@ enum ilo_image_walk_type {
};
struct ilo_image_info {
enum pipe_texture_target target;
enum gen_surface_type type;
enum pipe_format format;
@ -117,7 +117,7 @@ struct ilo_image_lod {
* Texture layout.
*/
struct ilo_image {
enum pipe_texture_target target;
enum gen_surface_type type;
/* size, format, etc for programming hardware states */
unsigned width0;

View File

@ -425,29 +425,6 @@ surface_set_gen7_buffer_SURFACE_STATE(struct ilo_state_surface *surf,
return true;
}
static enum gen_surface_type
get_gen6_surface_type(const struct ilo_dev *dev, const struct ilo_image *img)
{
ILO_DEV_ASSERT(dev, 6, 8);
switch (img->target) {
case PIPE_TEXTURE_1D:
case PIPE_TEXTURE_1D_ARRAY:
return GEN6_SURFTYPE_1D;
case PIPE_TEXTURE_2D:
case PIPE_TEXTURE_CUBE:
case PIPE_TEXTURE_RECT:
case PIPE_TEXTURE_2D_ARRAY:
case PIPE_TEXTURE_CUBE_ARRAY:
return GEN6_SURFTYPE_2D;
case PIPE_TEXTURE_3D:
return GEN6_SURFTYPE_3D;
default:
assert(!"unknown texture target");
return GEN6_SURFTYPE_NULL;
}
}
static bool
surface_validate_gen6_image(const struct ilo_dev *dev,
const struct ilo_state_surface_image_info *info)
@ -487,17 +464,19 @@ surface_validate_gen6_image(const struct ilo_dev *dev,
assert(info->img->bo_stride && info->img->bo_stride <= 512 * 1024 &&
info->img->width0 <= info->img->bo_stride);
if (info->is_cube_map) {
assert(get_gen6_surface_type(dev, info->img) == GEN6_SURFTYPE_2D);
/*
* From the Sandy Bridge PRM, volume 4 part 1, page 78:
*
* "For cube maps, Width must be set equal to the Height."
*/
assert(info->img->width0 == info->img->height0);
if (info->type != info->img->type) {
assert(info->type == GEN6_SURFTYPE_2D &&
info->img->type == GEN6_SURFTYPE_CUBE);
}
/*
* From the Sandy Bridge PRM, volume 4 part 1, page 78:
*
* "For cube maps, Width must be set equal to the Height."
*/
if (info->type == GEN6_SURFTYPE_CUBE)
assert(info->img->width0 == info->img->height0);
/*
* From the Sandy Bridge PRM, volume 4 part 1, page 72:
*
@ -532,20 +511,21 @@ surface_validate_gen6_image(const struct ilo_dev *dev,
}
static void
get_gen6_max_extent(const struct ilo_dev *dev,
const struct ilo_image *img,
uint16_t *max_w, uint16_t *max_h)
surface_get_gen6_image_max_extent(const struct ilo_dev *dev,
const struct ilo_state_surface_image_info *info,
uint16_t *max_w, uint16_t *max_h)
{
const uint16_t max_size = (ilo_dev_gen(dev) >= ILO_GEN(7)) ? 16384 : 8192;
ILO_DEV_ASSERT(dev, 6, 8);
switch (get_gen6_surface_type(dev, img)) {
switch (info->type) {
case GEN6_SURFTYPE_1D:
*max_w = max_size;
*max_h = 1;
break;
case GEN6_SURFTYPE_2D:
case GEN6_SURFTYPE_CUBE:
*max_w = max_size;
*max_h = max_size;
break;
@ -573,7 +553,7 @@ surface_get_gen6_image_extent(const struct ilo_dev *dev,
w = info->img->width0;
h = info->img->height0;
get_gen6_max_extent(dev, info->img, &max_w, &max_h);
surface_get_gen6_image_max_extent(dev, info, &max_w, &max_h);
assert(w && h && w <= max_w && h <= max_h);
*width = w - 1;
@ -624,16 +604,17 @@ surface_get_gen6_image_slices(const struct ilo_dev *dev,
* layers to (86 * 6), about 512.
*/
switch (get_gen6_surface_type(dev, info->img)) {
switch (info->type) {
case GEN6_SURFTYPE_1D:
case GEN6_SURFTYPE_2D:
case GEN6_SURFTYPE_CUBE:
max_slice = (ilo_dev_gen(dev) >= ILO_GEN(7.5)) ? 2048 : 512;
assert(info->img->array_size <= max_slice);
max_slice = info->img->array_size;
d = info->slice_count;
if (info->is_cube_map) {
if (info->type == GEN6_SURFTYPE_CUBE) {
if (info->access == ILO_STATE_SURFACE_ACCESS_SAMPLER) {
if (!d || d % 6) {
ilo_warn("invalid cube slice count\n");
@ -946,7 +927,6 @@ surface_set_gen6_image_SURFACE_STATE(struct ilo_state_surface *surf,
uint8_t min_lod, mip_count;
enum gen_sample_count sample_count;
uint32_t alignments;
enum gen_surface_type type;
uint32_t dw0, dw2, dw3, dw4, dw5;
ILO_DEV_ASSERT(dev, 6, 6);
@ -966,10 +946,7 @@ surface_set_gen6_image_SURFACE_STATE(struct ilo_state_surface *surf,
if (info->img->sample_count > 1)
assert(info->img->interleaved_samples);
type = (info->is_cube_map) ? GEN6_SURFTYPE_CUBE :
get_gen6_surface_type(dev, info->img);
dw0 = type << GEN6_SURFACE_DW0_TYPE__SHIFT |
dw0 = info->type << GEN6_SURFACE_DW0_TYPE__SHIFT |
info->format << GEN6_SURFACE_DW0_FORMAT__SHIFT |
GEN6_SURFACE_DW0_MIPLAYOUT_BELOW;
@ -996,7 +973,7 @@ surface_set_gen6_image_SURFACE_STATE(struct ilo_state_surface *surf,
* "When TEXCOORDMODE_CLAMP is used when accessing a cube map, this
* field must be programmed to 111111b (all faces enabled)."
*/
if (info->is_cube_map &&
if (info->type == GEN6_SURFTYPE_CUBE &&
info->access == ILO_STATE_SURFACE_ACCESS_SAMPLER) {
dw0 |= GEN6_SURFACE_DW0_CUBE_MAP_CORNER_MODE_AVERAGE |
GEN6_SURFACE_DW0_CUBE_FACE_ENABLES__MASK;
@ -1025,7 +1002,7 @@ surface_set_gen6_image_SURFACE_STATE(struct ilo_state_surface *surf,
surf->surface[4] = dw4;
surf->surface[5] = dw5;
surf->type = type;
surf->type = info->type;
surf->min_lod = min_lod;
surf->mip_count = mip_count;
@ -1041,7 +1018,6 @@ surface_set_gen7_image_SURFACE_STATE(struct ilo_state_surface *surf,
uint8_t min_lod, mip_count;
uint32_t alignments;
enum gen_sample_count sample_count;
enum gen_surface_type type;
uint32_t dw0, dw1, dw2, dw3, dw4, dw5, dw7;
ILO_DEV_ASSERT(dev, 7, 8);
@ -1055,10 +1031,7 @@ surface_set_gen7_image_SURFACE_STATE(struct ilo_state_surface *surf,
!surface_get_gen6_image_alignments(dev, info, &alignments))
return false;
type = (info->is_cube_map) ? GEN6_SURFTYPE_CUBE :
get_gen6_surface_type(dev, info->img);
dw0 = type << GEN7_SURFACE_DW0_TYPE__SHIFT |
dw0 = info->type << GEN7_SURFACE_DW0_TYPE__SHIFT |
info->format << GEN7_SURFACE_DW0_FORMAT__SHIFT |
alignments;
@ -1092,7 +1065,7 @@ surface_set_gen7_image_SURFACE_STATE(struct ilo_state_surface *surf,
* field must be programmed to 111111b (all faces enabled). This field
* is ignored unless the Surface Type is SURFTYPE_CUBE."
*/
if (info->is_cube_map &&
if (info->type == GEN6_SURFTYPE_CUBE &&
info->access == ILO_STATE_SURFACE_ACCESS_SAMPLER)
dw0 |= GEN7_SURFACE_DW0_CUBE_FACE_ENABLES__MASK;
@ -1156,7 +1129,7 @@ surface_set_gen7_image_SURFACE_STATE(struct ilo_state_surface *surf,
surf->surface[12] = 0;
}
surf->type = type;
surf->type = info->type;
surf->min_lod = min_lod;
surf->mip_count = mip_count;

View File

@ -72,11 +72,12 @@ struct ilo_state_surface_image_info {
enum ilo_state_surface_access access;
enum gen_surface_type type;
enum gen_surface_format format;
bool is_integer;
bool readonly;
bool is_cube_map;
bool is_array;
};

View File

@ -60,29 +60,6 @@ zs_set_gen6_null_3DSTATE_DEPTH_BUFFER(struct ilo_state_zs *zs,
return true;
}
static enum gen_surface_type
get_gen6_surface_type(const struct ilo_dev *dev, const struct ilo_image *img)
{
ILO_DEV_ASSERT(dev, 6, 8);
switch (img->target) {
case PIPE_TEXTURE_1D:
case PIPE_TEXTURE_1D_ARRAY:
return GEN6_SURFTYPE_1D;
case PIPE_TEXTURE_2D:
case PIPE_TEXTURE_CUBE:
case PIPE_TEXTURE_RECT:
case PIPE_TEXTURE_2D_ARRAY:
case PIPE_TEXTURE_CUBE_ARRAY:
return GEN6_SURFTYPE_2D;
case PIPE_TEXTURE_3D:
return GEN6_SURFTYPE_3D;
default:
assert(!"unknown texture target");
return GEN6_SURFTYPE_NULL;
}
}
static enum gen_depth_format
get_gen6_depth_format(const struct ilo_dev *dev, const struct ilo_image *img)
{
@ -148,50 +125,52 @@ zs_validate_gen6(const struct ilo_dev *dev,
/*
* From the Ivy Bridge PRM, volume 2 part 1, page 315:
*
* The stencil buffer has a format of S8_UINT, and shares Surface
* "The stencil buffer has a format of S8_UINT, and shares Surface
* Type, Height, Width, and Depth, Minimum Array Element, Render
* Target View Extent, Depth Coordinate Offset X/Y, LOD, and Depth
* Buffer Object Control State fields of the depth buffer.
* Buffer Object Control State fields of the depth buffer."
*/
if (info->z_img == info->s_img) {
assert(info->z_img->target == info->s_img->target &&
info->z_img->width0 == info->s_img->width0 &&
if (info->z_img && info->s_img && info->z_img != info->s_img) {
assert(info->z_img->type == info->s_img->type &&
info->z_img->height0 == info->s_img->height0 &&
info->z_img->depth0 == info->s_img->depth0);
}
if (info->type != img->type) {
assert(info->type == GEN6_SURFTYPE_2D &&
img->type == GEN6_SURFTYPE_CUBE);
}
assert(info->level < img->level_count);
assert(img->bo_stride);
if (info->is_cube_map) {
assert(get_gen6_surface_type(dev, img) == GEN6_SURFTYPE_2D);
/*
* From the Sandy Bridge PRM, volume 2 part 1, page 323:
*
* "For cube maps, Width must be set equal to Height."
*/
/*
* From the Sandy Bridge PRM, volume 2 part 1, page 323:
*
* "For cube maps, Width must be set equal to Height."
*/
if (info->type == GEN6_SURFTYPE_CUBE)
assert(img->width0 == img->height0);
}
return true;
}
static void
get_gen6_max_extent(const struct ilo_dev *dev,
const struct ilo_image *img,
uint16_t *max_w, uint16_t *max_h)
zs_get_gen6_max_extent(const struct ilo_dev *dev,
const struct ilo_state_zs_info *info,
uint16_t *max_w, uint16_t *max_h)
{
const uint16_t max_size = (ilo_dev_gen(dev) >= ILO_GEN(7)) ? 16384 : 8192;
ILO_DEV_ASSERT(dev, 6, 8);
switch (get_gen6_surface_type(dev, img)) {
switch (info->type) {
case GEN6_SURFTYPE_1D:
*max_w = max_size;
*max_h = 1;
break;
case GEN6_SURFTYPE_2D:
case GEN6_SURFTYPE_CUBE:
*max_w = max_size;
*max_h = max_size;
break;
@ -297,7 +276,7 @@ zs_get_gen6_depth_extent(const struct ilo_dev *dev,
h = align(h, align_h);
}
get_gen6_max_extent(dev, img, &max_w, &max_h);
zs_get_gen6_max_extent(dev, info, &max_w, &max_h);
assert(w && h && w <= max_w && h <= max_h);
*width = w - 1;
@ -326,16 +305,17 @@ zs_get_gen6_depth_slices(const struct ilo_dev *dev,
* surfaces. If the volume texture is MIP-mapped, this field specifies
* the depth of the base MIP level."
*/
switch (get_gen6_surface_type(dev, img)) {
switch (info->type) {
case GEN6_SURFTYPE_1D:
case GEN6_SURFTYPE_2D:
case GEN6_SURFTYPE_CUBE:
max_slice = (ilo_dev_gen(dev) >= ILO_GEN(7)) ? 2048 : 512;
assert(img->array_size <= max_slice);
max_slice = img->array_size;
d = info->slice_count;
if (info->is_cube_map) {
if (info->type == GEN6_SURFTYPE_CUBE) {
/*
* Minumum Array Element and Depth must be 0; Render Target View
* Extent is ignored.
@ -415,7 +395,6 @@ zs_set_gen6_3DSTATE_DEPTH_BUFFER(struct ilo_state_zs *zs,
const struct ilo_state_zs_info *info)
{
uint16_t width, height, depth, array_base, view_extent;
enum gen_surface_type type;
enum gen_depth_format format;
uint32_t dw1, dw2, dw3, dw4;
@ -427,10 +406,6 @@ zs_set_gen6_3DSTATE_DEPTH_BUFFER(struct ilo_state_zs *zs,
&view_extent))
return false;
type = (info->is_cube_map) ? GEN6_SURFTYPE_CUBE :
(info->z_img) ? get_gen6_surface_type(dev, info->z_img) :
get_gen6_surface_type(dev, info->s_img);
format = (info->z_img) ? get_gen6_depth_format(dev, info->z_img) :
GEN6_ZFORMAT_D32_FLOAT;
@ -450,7 +425,7 @@ zs_set_gen6_3DSTATE_DEPTH_BUFFER(struct ilo_state_zs *zs,
format = GEN6_ZFORMAT_D24_UNORM_S8_UINT;
/* info->z_readonly and info->s_readonly are ignored on Gen6 */
dw1 = type << GEN6_DEPTH_DW1_TYPE__SHIFT |
dw1 = info->type << GEN6_DEPTH_DW1_TYPE__SHIFT |
GEN6_TILING_Y << GEN6_DEPTH_DW1_TILING__SHIFT |
format << GEN6_DEPTH_DW1_FORMAT__SHIFT;
@ -488,7 +463,6 @@ zs_set_gen7_3DSTATE_DEPTH_BUFFER(struct ilo_state_zs *zs,
const struct ilo_dev *dev,
const struct ilo_state_zs_info *info)
{
enum gen_surface_type type;
enum gen_depth_format format;
uint16_t width, height, depth;
uint16_t array_base, view_extent;
@ -502,14 +476,10 @@ zs_set_gen7_3DSTATE_DEPTH_BUFFER(struct ilo_state_zs *zs,
&view_extent))
return false;
type = (info->is_cube_map) ? GEN6_SURFTYPE_CUBE :
(info->z_img) ? get_gen6_surface_type(dev, info->z_img) :
get_gen6_surface_type(dev, info->s_img);
format = (info->z_img) ? get_gen6_depth_format(dev, info->z_img) :
GEN6_ZFORMAT_D32_FLOAT;
dw1 = type << GEN7_DEPTH_DW1_TYPE__SHIFT |
dw1 = info->type << GEN7_DEPTH_DW1_TYPE__SHIFT |
format << GEN7_DEPTH_DW1_FORMAT__SHIFT;
if (info->z_img) {
@ -714,6 +684,7 @@ ilo_state_zs_init_for_null(struct ilo_state_zs *zs,
struct ilo_state_zs_info info;
memset(&info, 0, sizeof(info));
info.type = GEN6_SURFTYPE_NULL;
return ilo_state_zs_init(zs, dev, &info);
}

View File

@ -48,11 +48,11 @@ struct ilo_state_zs_info {
const struct ilo_vma *s_vma;
const struct ilo_vma *hiz_vma;
enum gen_surface_type type;
/* ignored prior to Gen7 */
bool z_readonly;
bool s_readonly;
bool is_cube_map;
};
struct ilo_state_zs {

View File

@ -87,6 +87,28 @@ resource_get_cpu_init(const struct pipe_resource *templ)
PIPE_BIND_STREAM_OUTPUT)) ? false : true;
}
static enum gen_surface_type
get_surface_type(enum pipe_texture_target target)
{
switch (target) {
case PIPE_TEXTURE_1D:
case PIPE_TEXTURE_1D_ARRAY:
return GEN6_SURFTYPE_1D;
case PIPE_TEXTURE_2D:
case PIPE_TEXTURE_RECT:
case PIPE_TEXTURE_2D_ARRAY:
return GEN6_SURFTYPE_2D;
case PIPE_TEXTURE_3D:
return GEN6_SURFTYPE_3D;
case PIPE_TEXTURE_CUBE:
case PIPE_TEXTURE_CUBE_ARRAY:
return GEN6_SURFTYPE_CUBE;
default:
assert(!"unknown texture target");
return GEN6_SURFTYPE_NULL;
}
}
static void
resource_get_image_info(const struct pipe_resource *templ,
const struct ilo_dev *dev,
@ -95,7 +117,7 @@ resource_get_image_info(const struct pipe_resource *templ,
{
memset(info, 0, sizeof(*info));
info->target = templ->target;
info->type = get_surface_type(templ->target);
info->format = image_format;
info->width = templ->width0;

View File

@ -2045,6 +2045,7 @@ ilo_create_sampler_view(struct pipe_context *pipe,
info.vma = &tex->vma;
info.access = ILO_STATE_SURFACE_ACCESS_SAMPLER;
info.type = tex->image.type;
if (templ->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT &&
tex->image.separate_stencil) {
@ -2054,8 +2055,6 @@ ilo_create_sampler_view(struct pipe_context *pipe,
info.format = ilo_format_translate_texture(dev, templ->format);
}
info.is_cube_map = (tex->image.target == PIPE_TEXTURE_CUBE ||
tex->image.target == PIPE_TEXTURE_CUBE_ARRAY);
info.is_array = util_resource_is_array_texture(&tex->base);
info.readonly = true;
@ -2116,6 +2115,10 @@ ilo_create_surface(struct pipe_context *pipe,
info.aux_vma = &tex->aux_vma;
info.access = ILO_STATE_SURFACE_ACCESS_DP_RENDER;
info.type = (tex->image.type == GEN6_SURFTYPE_CUBE) ?
GEN6_SURFTYPE_2D : tex->image.type;
info.format = ilo_format_translate_render(dev, templ->format);
info.is_array = util_resource_is_array_texture(&tex->base);
@ -2148,6 +2151,9 @@ ilo_create_surface(struct pipe_context *pipe,
info.slice_count = templ->u.tex.last_layer -
templ->u.tex.first_layer + 1;
info.type = (tex->image.type == GEN6_SURFTYPE_CUBE) ?
GEN6_SURFTYPE_2D : tex->image.type;
ilo_state_zs_init(&surf->u.zs, dev, &info);
}