blob: 2af2064d0660dbdeb8dc977e9f3e1a3173e24a8f [file]
/*
* Copyright 2020 Intel Corporation
*
* 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 (including the next
* paragraph) 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.
*/
#include <stdint.h>
#define __gen_address_type uint64_t
#define __gen_user_data void
static uint64_t
__gen_combine_address(__attribute__((unused)) void *data,
__attribute__((unused)) void *loc, uint64_t addr,
uint32_t delta)
{
return addr + delta;
}
#include "genxml/gen_macros.h"
#include "genxml/genX_pack.h"
#include "isl_priv.h"
#include "isl_genX_helpers.h"
#if GFX_VERx10 >= 125
static const uint8_t isl_encode_tiling[] = {
[ISL_TILING_4] = TILE4,
[ISL_TILING_64] = TILE64,
[ISL_TILING_64_XE2] = TILE64,
};
#endif
void
isl_genX(emit_cpb_control_s)(const struct isl_device *dev, void *batch,
const struct isl_cpb_emit_info *restrict info)
{
#if GFX_VERx10 >= 125
if (info->surf) {
assert((info->surf->usage & ISL_SURF_USAGE_CPB_BIT));
assert(info->surf->dim != ISL_SURF_DIM_3D);
assert(info->surf->tiling == ISL_TILING_4 ||
isl_tiling_is_64(info->surf->tiling));
assert(info->surf->format == ISL_FORMAT_R8_UINT);
}
struct GENX(3DSTATE_CPSIZE_CONTROL_BUFFER) cpb = {
GENX(3DSTATE_CPSIZE_CONTROL_BUFFER_header),
};
if (info->surf) {
/* BSpec 46962 has a number of restriction on the fields of this packet
* like :
*
* "The Width specified by this field must be less than or equal to
* the surface pitch (specified in bytes via the Surface Pitch field).
* For cube maps, Width must be set equal to Height.
*
* 1. The Width ofthis buffer must be the same as the Width of the
* render target(s) (defined in SURFACE_STATE), unless Surface
* Type is SURFTYPE_1D or SURFTYPE_2D with Depth = 0 (non-array)
* and LOD = 0 (non-mip mapped).
*
* 2. Depth buffer (defined in 3DSTATE_DEPTH_BUFFER) unless either
* the depth buffer or this buffer surf_typeare SURFTYPE_NULL"
*
* Unfortunately APIs like Vulkan do not give guarantees that every
* framebuffer attachment will match in size (RT & CPB surfaces for
* example). But at least it gives a guarantee that all the attachments
* of a render pass will be at least be large enough to handle the
* rendered area. So here we use the CPB surface values, even if they
* don't strictly match the various BSpec restrictions.
*/
cpb.Width = (info->surf->logical_level0_px.width * 8) - 1;
cpb.Height = (info->surf->logical_level0_px.height * 8) - 1;
cpb.Depth = info->view->array_len - 1;
cpb.RenderTargetViewExtent = cpb.Depth;
cpb.SurfLOD = info->view->base_level;
cpb.MinimumArrayElement = info->view->base_array_layer;
cpb.SurfaceType = SURFTYPE_2D;
cpb.SurfacePitch = info->surf->row_pitch_B - 1;
cpb.MOCS = info->mocs;
cpb.SurfaceQPitch = isl_surf_get_array_pitch_sa_rows(info->surf) >> 2;
cpb.TiledMode = isl_encode_tiling[info->surf->tiling];
assert(info->address % info->surf->alignment_B == 0);
cpb.SurfaceBaseAddress = info->address;
cpb.MipTailStartLOD = info->surf->miptail_start_level;
#if GFX_VER >= 20
cpb.CompressionFormat =
isl_get_render_compression_format(info->surf->format);
#else
cpb.LosslessCompressionEnable =
isl_aux_usage_has_compression(info->aux_usage);
#endif
} else {
cpb.SurfaceType = SURFTYPE_NULL;
cpb.TiledMode = TILE64;
}
/* Pack everything into the batch */
uint32_t *dw = batch;
GENX(3DSTATE_CPSIZE_CONTROL_BUFFER_pack)(NULL, dw, &cpb);
#else
unreachable("Coarse pixel shading not supported");
#endif
}