mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-10 19:00:13 +01:00
anv: Populate SURFACE_STATE more safely
genX_image_view_init allocates up to 3 separate SURFACE_STATE structures, and populates each from a single template. Stop mutating the template between each final SURFACE_STATE.
This commit is contained in:
parent
eab6212efd
commit
0e420cb67f
2 changed files with 27 additions and 15 deletions
|
|
@ -173,7 +173,7 @@ genX(image_view_init)(struct anv_image_view *iview,
|
|||
const struct isl_extent3d image_align_sa =
|
||||
isl_surf_get_image_alignment_sa(&surface->isl);
|
||||
|
||||
struct GENX(RENDER_SURFACE_STATE) surface_state = {
|
||||
const struct GENX(RENDER_SURFACE_STATE) template = {
|
||||
.SurfaceType = anv_surftype(image, pCreateInfo->viewType, false),
|
||||
.SurfaceArray = image->array_size > 1,
|
||||
.SurfaceFormat = iview->format,
|
||||
|
|
@ -227,6 +227,8 @@ genX(image_view_init)(struct anv_image_view *iview,
|
|||
};
|
||||
|
||||
if (image->needs_nonrt_surface_state) {
|
||||
struct GENX(RENDER_SURFACE_STATE) surface_state = template;
|
||||
|
||||
iview->nonrt_surface_state = alloc_surface_state(device, cmd_buffer);
|
||||
|
||||
surface_state.RenderCacheReadWriteMode = false;
|
||||
|
|
@ -248,6 +250,8 @@ genX(image_view_init)(struct anv_image_view *iview,
|
|||
}
|
||||
|
||||
if (image->needs_color_rt_surface_state) {
|
||||
struct GENX(RENDER_SURFACE_STATE) surface_state = template;
|
||||
|
||||
iview->color_rt_surface_state = alloc_surface_state(device, cmd_buffer);
|
||||
|
||||
surface_state.RenderCacheReadWriteMode = 0; /* Write only */
|
||||
|
|
@ -270,6 +274,8 @@ genX(image_view_init)(struct anv_image_view *iview,
|
|||
}
|
||||
|
||||
if (image->needs_storage_surface_state) {
|
||||
struct GENX(RENDER_SURFACE_STATE) surface_state = template;
|
||||
|
||||
iview->storage_surface_state = alloc_surface_state(device, cmd_buffer);
|
||||
|
||||
surface_state.SurfaceType =
|
||||
|
|
|
|||
|
|
@ -187,7 +187,7 @@ genX(image_view_init)(struct anv_image_view *iview,
|
|||
uint32_t halign, valign;
|
||||
get_halign_valign(&surface->isl, &halign, &valign);
|
||||
|
||||
struct GENX(RENDER_SURFACE_STATE) surface_state = {
|
||||
struct GENX(RENDER_SURFACE_STATE) template = {
|
||||
.SurfaceType = anv_surftype(image, pCreateInfo->viewType, false),
|
||||
.SurfaceArray = image->array_size > 1,
|
||||
.SurfaceFormat = iview->format,
|
||||
|
|
@ -237,10 +237,10 @@ genX(image_view_init)(struct anv_image_view *iview,
|
|||
.SurfaceBaseAddress = { NULL, iview->offset },
|
||||
};
|
||||
|
||||
switch (surface_state.SurfaceType) {
|
||||
switch (template.SurfaceType) {
|
||||
case SURFTYPE_1D:
|
||||
case SURFTYPE_2D:
|
||||
surface_state.MinimumArrayElement = range->baseArrayLayer;
|
||||
template.MinimumArrayElement = range->baseArrayLayer;
|
||||
|
||||
/* From the Broadwell PRM >> RENDER_SURFACE_STATE::Depth:
|
||||
*
|
||||
|
|
@ -251,37 +251,37 @@ genX(image_view_init)(struct anv_image_view *iview,
|
|||
*
|
||||
* In other words, 'Depth' is the number of array layers.
|
||||
*/
|
||||
surface_state.Depth = range->layerCount - 1;
|
||||
template.Depth = range->layerCount - 1;
|
||||
|
||||
/* From the Broadwell PRM >> RENDER_SURFACE_STATE::RenderTargetViewExtent:
|
||||
*
|
||||
* For Render Target and Typed Dataport 1D and 2D Surfaces:
|
||||
* This field must be set to the same value as the Depth field.
|
||||
*/
|
||||
surface_state.RenderTargetViewExtent = surface_state.Depth;
|
||||
template.RenderTargetViewExtent = template.Depth;
|
||||
break;
|
||||
case SURFTYPE_CUBE:
|
||||
#if ANV_GENx10 >= 90
|
||||
/* Like SURFTYPE_2D, but divided by 6. */
|
||||
surface_state.MinimumArrayElement = range->baseArrayLayer / 6;
|
||||
surface_state.Depth = range->layerCount / 6 - 1;
|
||||
surface_state.RenderTargetViewExtent = surface_state.Depth;
|
||||
template.MinimumArrayElement = range->baseArrayLayer / 6;
|
||||
template.Depth = range->layerCount / 6 - 1;
|
||||
template.RenderTargetViewExtent = template.Depth;
|
||||
#else
|
||||
/* Same as SURFTYPE_2D */
|
||||
surface_state.MinimumArrayElement = range->baseArrayLayer;
|
||||
surface_state.Depth = range->layerCount - 1;
|
||||
surface_state.RenderTargetViewExtent = surface_state.Depth;
|
||||
template.MinimumArrayElement = range->baseArrayLayer;
|
||||
template.Depth = range->layerCount - 1;
|
||||
template.RenderTargetViewExtent = template.Depth;
|
||||
#endif
|
||||
break;
|
||||
case SURFTYPE_3D:
|
||||
surface_state.MinimumArrayElement = range->baseArrayLayer;
|
||||
template.MinimumArrayElement = range->baseArrayLayer;
|
||||
|
||||
/* From the Broadwell PRM >> RENDER_SURFACE_STATE::Depth:
|
||||
*
|
||||
* If the volume texture is MIP-mapped, this field specifies the
|
||||
* depth of the base MIP level.
|
||||
*/
|
||||
surface_state.Depth = image->extent.depth - 1;
|
||||
template.Depth = image->extent.depth - 1;
|
||||
|
||||
/* From the Broadwell PRM >> RENDER_SURFACE_STATE::RenderTargetViewExtent:
|
||||
*
|
||||
|
|
@ -289,13 +289,15 @@ genX(image_view_init)(struct anv_image_view *iview,
|
|||
* indicates the extent of the accessible 'R' coordinates minus 1 on
|
||||
* the LOD currently being rendered to.
|
||||
*/
|
||||
surface_state.RenderTargetViewExtent = iview->extent.depth - 1;
|
||||
template.RenderTargetViewExtent = iview->extent.depth - 1;
|
||||
break;
|
||||
default:
|
||||
unreachable(!"bad SurfaceType");
|
||||
}
|
||||
|
||||
if (image->needs_nonrt_surface_state) {
|
||||
struct GENX(RENDER_SURFACE_STATE) surface_state = template;
|
||||
|
||||
iview->nonrt_surface_state =
|
||||
alloc_surface_state(device, cmd_buffer);
|
||||
|
||||
|
|
@ -315,6 +317,8 @@ genX(image_view_init)(struct anv_image_view *iview,
|
|||
}
|
||||
|
||||
if (image->needs_color_rt_surface_state) {
|
||||
struct GENX(RENDER_SURFACE_STATE) surface_state = template;
|
||||
|
||||
iview->color_rt_surface_state =
|
||||
alloc_surface_state(device, cmd_buffer);
|
||||
|
||||
|
|
@ -336,6 +340,8 @@ genX(image_view_init)(struct anv_image_view *iview,
|
|||
}
|
||||
|
||||
if (image->needs_storage_surface_state) {
|
||||
struct GENX(RENDER_SURFACE_STATE) surface_state = template;
|
||||
|
||||
iview->storage_surface_state =
|
||||
alloc_surface_state(device, cmd_buffer);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue