diff options
author | Chia-I Wu <[email protected]> | 2015-06-24 22:47:30 +0800 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2015-06-26 13:45:28 +0800 |
commit | dc2e92b2d3d216fc9657f2ef594d7c5d0b03370e (patch) | |
tree | 95a14db92d3e63e6e25d29bd798d4e354e7884aa /src/gallium/drivers/ilo/core | |
parent | 934e4a469fd37dac03b8280cce41df4d9f4ed123 (diff) |
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.
Diffstat (limited to 'src/gallium/drivers/ilo/core')
-rw-r--r-- | src/gallium/drivers/ilo/core/ilo_image.c | 18 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/core/ilo_image.h | 4 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/core/ilo_state_surface.c | 77 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/core/ilo_state_surface.h | 3 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/core/ilo_state_zs.c | 83 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/core/ilo_state_zs.h | 4 |
6 files changed, 67 insertions, 122 deletions
diff --git a/src/gallium/drivers/ilo/core/ilo_image.c b/src/gallium/drivers/ilo/core/ilo_image.c index 39c6daaafd3..9ec6792146f 100644 --- a/src/gallium/drivers/ilo/core/ilo_image.c +++ b/src/gallium/drivers/ilo/core/ilo_image.c @@ -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; diff --git a/src/gallium/drivers/ilo/core/ilo_image.h b/src/gallium/drivers/ilo/core/ilo_image.h index e488bef0d3f..1c4f86c78da 100644 --- a/src/gallium/drivers/ilo/core/ilo_image.h +++ b/src/gallium/drivers/ilo/core/ilo_image.h @@ -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; diff --git a/src/gallium/drivers/ilo/core/ilo_state_surface.c b/src/gallium/drivers/ilo/core/ilo_state_surface.c index 2caba6df46e..40fe15f316f 100644 --- a/src/gallium/drivers/ilo/core/ilo_state_surface.c +++ b/src/gallium/drivers/ilo/core/ilo_state_surface.c @@ -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,16 +464,18 @@ 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); + 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." - */ + /* + * 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; diff --git a/src/gallium/drivers/ilo/core/ilo_state_surface.h b/src/gallium/drivers/ilo/core/ilo_state_surface.h index 835df69882e..e78c7c97db1 100644 --- a/src/gallium/drivers/ilo/core/ilo_state_surface.h +++ b/src/gallium/drivers/ilo/core/ilo_state_surface.h @@ -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; }; diff --git a/src/gallium/drivers/ilo/core/ilo_state_zs.c b/src/gallium/drivers/ilo/core/ilo_state_zs.c index 7b82f1acf6f..306e6d9aedc 100644 --- a/src/gallium/drivers/ilo/core/ilo_state_zs.c +++ b/src/gallium/drivers/ilo/core/ilo_state_zs.c @@ -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); } diff --git a/src/gallium/drivers/ilo/core/ilo_state_zs.h b/src/gallium/drivers/ilo/core/ilo_state_zs.h index 6f32b7e2efe..d78a12ad516 100644 --- a/src/gallium/drivers/ilo/core/ilo_state_zs.h +++ b/src/gallium/drivers/ilo/core/ilo_state_zs.h @@ -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 { |