compute-runtime/level_zero/core/source/image_hw.h

151 lines
15 KiB
C++

/*
* Copyright (C) 2019-2020 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#pragma once
#include "shared/source/command_stream/linear_stream.h"
#include "shared/source/helpers/hw_info.h"
#include "shared/source/helpers/surface_format_info.h"
#include "shared/source/indirect_heap/indirect_heap.h"
#include "level_zero/core/source/image_formats_append.h"
#include "level_zero/core/source/image_imp.h"
namespace L0 {
template <GFXCORE_FAMILY gfxCoreFamily>
struct ImageCoreFamily : public ImageImp {
using GfxFamily = typename NEO::GfxFamilyMapper<gfxCoreFamily>::GfxFamily;
using RENDER_SURFACE_STATE = typename GfxFamily::RENDER_SURFACE_STATE;
using RSS = typename GfxFamily::RENDER_SURFACE_STATE;
using RENDER_FORMAT = typename RENDER_SURFACE_STATE::SURFACE_FORMAT;
using SHADER_CHANNEL_SELECT = typename RENDER_SURFACE_STATE::SHADER_CHANNEL_SELECT;
using ImageImp::ImageImp;
static const RENDER_FORMAT surfaceFormatUndefined = static_cast<RENDER_FORMAT>(-1);
static const GMM_RESOURCE_FORMAT gmmResourceFormatUndefined = static_cast<GMM_RESOURCE_FORMAT>(-1);
NEO::SurfaceFormatInfo surfaceFormatsForRedescribe[5] = {
{GMM_FORMAT_R8_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R8_UINT), 0, 1, 1, 1},
{GMM_FORMAT_R16_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16_UINT), 0, 1, 2, 2},
{GMM_FORMAT_R32_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32_UINT), 0, 1, 4, 4},
{GMM_FORMAT_R32G32_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32G32_UINT), 0, 2, 4, 8},
{GMM_FORMAT_R32G32B32A32_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32G32B32A32_UINT), 0, 4, 4, 16}};
NEO::SurfaceFormatInfo surfaceFormatTable[ZE_IMAGE_FORMAT_RENDER_LAYOUT_MAX + 1]
[ZE_IMAGE_FORMAT_TYPE_MAX + 1] = {
// ZE_IMAGE_FORMAT_LAYOUT_8
{{GMM_FORMAT_R8_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R8_UINT), 0, 1, 1, 1},
{GMM_FORMAT_R8_SINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R8_SINT), 0, 1, 1, 1},
{GMM_FORMAT_R8_UNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R8_UNORM), 0, 1, 1, 1},
{GMM_FORMAT_R8_SNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R8_SNORM), 0, 1, 1, 1},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 1, 1, 1}},
// ZE_IMAGE_FORMAT_LAYOUT_16
{{GMM_FORMAT_R16_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16_UINT), 0, 1, 2, 2},
{GMM_FORMAT_R16_SINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16_SINT), 0, 1, 2, 2},
{GMM_FORMAT_R16_UNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16_UNORM), 0, 1, 2, 2},
{GMM_FORMAT_R16_SNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16_SNORM), 0, 1, 2, 2},
{GMM_FORMAT_R16_FLOAT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16_FLOAT), 0, 1, 2, 2}},
// ZE_IMAGE_FORMAT_LAYOUT_32
{{GMM_FORMAT_R32_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32_UINT), 0, 1, 4, 4},
{GMM_FORMAT_R32_SINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32_SINT), 0, 1, 4, 4},
{GMM_FORMAT_R32_UNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32_UNORM), 0, 1, 4, 4},
{GMM_FORMAT_R32_SNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32_SNORM), 0, 1, 4, 4},
{GMM_FORMAT_R32_FLOAT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32_FLOAT), 0, 1, 4, 4}},
// ZE_IMAGE_FORMAT_LAYOUT_8_8
{{GMM_FORMAT_R8G8_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R8G8_UINT), 0, 2, 1, 2},
{GMM_FORMAT_R8G8_SINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R8G8_SINT), 0, 2, 1, 2},
{GMM_FORMAT_R8G8_UNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R8G8_UNORM), 0, 2, 1, 2},
{GMM_FORMAT_R8G8_SNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R8G8_SNORM), 0, 2, 1, 2},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 2, 1, 2}},
// ZE_IMAGE_FORMAT_LAYOUT_8_8_8_8
{{GMM_FORMAT_R8G8B8A8_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R8G8B8A8_UINT), 0, 4, 1, 4},
{GMM_FORMAT_R8G8B8A8_SINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R8G8B8A8_SINT), 0, 4, 1, 4},
{GMM_FORMAT_R8G8B8A8_UNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R8G8B8A8_UNORM), 0, 4, 1, 4},
{GMM_FORMAT_R8G8B8A8_SNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R8G8B8A8_SNORM), 0, 4, 1, 4},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 4, 1, 4}},
// ZE_IMAGE_FORMAT_LAYOUT_16_16
{{GMM_FORMAT_R16G16_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16G16_UINT), 0, 2, 2, 4},
{GMM_FORMAT_R16G16_SINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16G16_SINT), 0, 2, 2, 4},
{GMM_FORMAT_R16G16_UNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16G16_UNORM), 0, 2, 2, 4},
{GMM_FORMAT_R16G16_SNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16G16_SNORM), 0, 2, 2, 4},
{GMM_FORMAT_R16G16_FLOAT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16G16_FLOAT), 0, 2, 2, 4}},
// ZE_IMAGE_FORMAT_LAYOUT_16_16_16_16
{{GMM_FORMAT_R16G16B16A16_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16G16B16A16_UINT), 0, 4, 2, 8},
{GMM_FORMAT_R16G16B16A16_SINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16G16B16A16_SINT), 0, 4, 2, 8},
{GMM_FORMAT_R16G16B16A16_UNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16G16B16A16_UNORM), 0, 4, 2, 8},
{GMM_FORMAT_R16G16B16A16_SNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16G16B16A16_SNORM), 0, 4, 2, 8},
{GMM_FORMAT_R16G16B16A16_FLOAT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R16G16B16A16_FLOAT), 0, 4, 2, 8}},
// ZE_IMAGE_FORMAT_LAYOUT_32_32
{{GMM_FORMAT_R32G32_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32G32_UINT), 0, 2, 4, 8},
{GMM_FORMAT_R32G32_SINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32G32_SINT), 0, 2, 4, 8},
{GMM_FORMAT_R32G32_UNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32G32_UNORM), 0, 2, 4, 8},
{GMM_FORMAT_R32G32_SNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32G32_SNORM), 0, 2, 4, 8},
{GMM_FORMAT_R32G32_FLOAT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32G32_FLOAT), 0, 2, 4, 8}},
// ZE_IMAGE_FORMAT_LAYOUT_32_32_32_32
{{GMM_FORMAT_R32G32B32A32_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32G32B32A32_UINT), 0, 4, 4, 16},
{GMM_FORMAT_R32G32B32A32_SINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32G32B32A32_SINT), 0, 4, 4, 16},
{GMM_FORMAT_R32G32B32A32_UNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32G32B32A32_UNORM), 0, 4, 4, 16},
{GMM_FORMAT_R32G32B32A32_SNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32G32B32A32_SNORM), 0, 4, 4, 16},
{GMM_FORMAT_R32G32B32A32_FLOAT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R32G32B32A32_FLOAT), 0, 4, 4, 16}},
// ZE_IMAGE_FORMAT_LAYOUT_10_10_10_2
{{GMM_FORMAT_R10G10B10A2_UINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R10G10B10A2_UINT), 0, 1, 1, 1},
{GMM_FORMAT_R10G10B10A2_SINT_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R10G10B10A2_SINT), 0, 1, 1, 1},
{GMM_FORMAT_R10G10B10A2_UNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R10G10B10A2_UNORM), 0, 1, 1, 1},
{GMM_FORMAT_R10G10B10A2_SNORM_TYPE, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(RSS::SURFACE_FORMAT_R10G10B10A2_SNORM), 0, 1, 1, 1},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 1, 1, 1}},
// ZE_IMAGE_FORMAT_LAYOUT_11_11_10
{{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0}},
// ZE_IMAGE_FORMAT_LAYOUT_5_6_5
{{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0}},
// ZE_IMAGE_FORMAT_LAYOUT_5_5_5_1
{{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0}},
// ZE_IMAGE_FORMAT_LAYOUT_4_4_4_4
{{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0},
{gmmResourceFormatUndefined, static_cast<NEO::GFX3DSTATE_SURFACEFORMAT>(surfaceFormatUndefined), 0, 0, 0, 0}}};
const SHADER_CHANNEL_SELECT shaderChannelSelect[ZE_IMAGE_FORMAT_SWIZZLE_MAX + 1] = {
RSS::SHADER_CHANNEL_SELECT_RED,
RSS::SHADER_CHANNEL_SELECT_GREEN,
RSS::SHADER_CHANNEL_SELECT_BLUE,
RSS::SHADER_CHANNEL_SELECT_ALPHA,
RSS::SHADER_CHANNEL_SELECT_ZERO,
RSS::SHADER_CHANNEL_SELECT_ONE,
RSS::SHADER_CHANNEL_SELECT_ZERO,
};
bool initialize(Device *device, const ze_image_desc_t *desc) override;
void copySurfaceStateToSSH(void *surfaceStateHeap, const uint32_t surfaceStateOffset) override;
void copyRedescribedSurfaceStateToSSH(void *surfaceStateHeap, const uint32_t surfaceStateOffset) override;
protected:
RENDER_SURFACE_STATE surfaceState;
RENDER_SURFACE_STATE redescribedSurfaceState;
};
template <uint32_t gfxProductFamily>
struct ImageProductFamily;
} // namespace L0