2019-04-03 21:59:31 +08:00
|
|
|
/*
|
2021-01-28 18:01:51 +08:00
|
|
|
* Copyright (C) 2019-2021 Intel Corporation
|
2019-04-03 21:59:31 +08:00
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
2020-02-24 05:44:01 +08:00
|
|
|
#include "shared/source/command_stream/csr_deps.h"
|
2020-05-21 18:36:23 +08:00
|
|
|
#include "shared/source/gmm_helper/gmm.h"
|
2020-02-24 05:44:01 +08:00
|
|
|
#include "shared/source/helpers/aux_translation.h"
|
2020-06-17 20:58:28 +08:00
|
|
|
#include "shared/source/helpers/common_types.h"
|
2020-04-02 17:28:38 +08:00
|
|
|
#include "shared/source/helpers/constants.h"
|
2020-02-25 16:55:13 +08:00
|
|
|
#include "shared/source/helpers/vec.h"
|
2020-02-24 05:44:01 +08:00
|
|
|
#include "shared/source/utilities/stackvec.h"
|
2019-06-26 17:37:46 +08:00
|
|
|
|
2019-04-03 21:59:31 +08:00
|
|
|
#include <cstdint>
|
2020-07-10 23:04:42 +08:00
|
|
|
#include <functional>
|
2019-04-03 21:59:31 +08:00
|
|
|
|
|
|
|
namespace NEO {
|
2019-06-27 22:08:20 +08:00
|
|
|
class CommandStreamReceiver;
|
2020-07-10 23:04:42 +08:00
|
|
|
class Device;
|
2019-04-03 21:59:31 +08:00
|
|
|
class GraphicsAllocation;
|
|
|
|
class LinearStream;
|
2020-09-15 15:33:12 +08:00
|
|
|
|
2020-02-10 21:17:12 +08:00
|
|
|
struct RootDeviceEnvironment;
|
2019-11-13 00:56:10 +08:00
|
|
|
|
|
|
|
template <typename TagType>
|
2021-03-25 02:21:13 +08:00
|
|
|
class TagNode;
|
2019-06-26 17:37:46 +08:00
|
|
|
|
2020-09-15 15:33:12 +08:00
|
|
|
template <typename TSize>
|
2021-03-22 23:14:49 +08:00
|
|
|
class TimestampPackets;
|
2020-09-15 15:33:12 +08:00
|
|
|
|
2021-03-25 02:21:13 +08:00
|
|
|
class TagNodeBase;
|
|
|
|
|
2019-11-18 20:35:44 +08:00
|
|
|
struct BlitProperties;
|
2020-02-11 01:14:52 +08:00
|
|
|
struct HardwareInfo;
|
2019-11-18 20:35:44 +08:00
|
|
|
struct TimestampPacketDependencies;
|
2019-11-25 16:11:37 +08:00
|
|
|
using BlitPropertiesContainer = StackVec<BlitProperties, 16>;
|
2019-11-18 20:35:44 +08:00
|
|
|
|
2019-06-26 17:37:46 +08:00
|
|
|
struct BlitProperties {
|
2021-06-08 21:09:19 +08:00
|
|
|
static BlitProperties constructPropertiesForReadWrite(BlitterConstants::BlitDirection blitDirection,
|
|
|
|
CommandStreamReceiver &commandStreamReceiver,
|
|
|
|
GraphicsAllocation *memObjAllocation,
|
|
|
|
GraphicsAllocation *preallocatedHostAllocation,
|
|
|
|
const void *hostPtr, uint64_t memObjGpuVa,
|
|
|
|
uint64_t hostAllocGpuVa, Vec3<size_t> hostPtrOffset,
|
|
|
|
Vec3<size_t> copyOffset, Vec3<size_t> copySize,
|
|
|
|
size_t hostRowPitch, size_t hostSlicePitch,
|
|
|
|
size_t gpuRowPitch, size_t gpuSlicePitch);
|
2019-06-26 17:37:46 +08:00
|
|
|
|
2019-07-01 17:08:58 +08:00
|
|
|
static BlitProperties constructPropertiesForCopyBuffer(GraphicsAllocation *dstAllocation, GraphicsAllocation *srcAllocation,
|
2020-04-02 17:47:30 +08:00
|
|
|
Vec3<size_t> dstOffset, Vec3<size_t> srcOffset, Vec3<size_t> copySize,
|
|
|
|
size_t srcRowPitch, size_t srcSlicePitch,
|
2020-11-19 07:58:42 +08:00
|
|
|
size_t dstRowPitch, size_t dstSlicePitch, GraphicsAllocation *clearColorAllocation);
|
2019-07-01 17:08:58 +08:00
|
|
|
|
2019-07-04 20:22:28 +08:00
|
|
|
static BlitProperties constructPropertiesForAuxTranslation(AuxTranslationDirection auxTranslationDirection,
|
2020-11-19 07:58:42 +08:00
|
|
|
GraphicsAllocation *allocation, GraphicsAllocation *clearColorAllocation);
|
2019-07-04 20:22:28 +08:00
|
|
|
|
2019-11-18 20:35:44 +08:00
|
|
|
static void setupDependenciesForAuxTranslation(BlitPropertiesContainer &blitPropertiesContainer, TimestampPacketDependencies ×tampPacketDependencies,
|
2020-01-27 20:06:03 +08:00
|
|
|
TimestampPacketContainer &kernelTimestamps, const CsrDependencies &depsFromEvents,
|
2019-11-18 20:35:44 +08:00
|
|
|
CommandStreamReceiver &gpguCsr, CommandStreamReceiver &bcsCsr);
|
|
|
|
|
2021-03-25 02:21:13 +08:00
|
|
|
TagNodeBase *outputTimestampPacket = nullptr;
|
2019-07-01 17:08:58 +08:00
|
|
|
BlitterConstants::BlitDirection blitDirection;
|
2019-06-26 17:37:46 +08:00
|
|
|
CsrDependencies csrDependencies;
|
2019-07-04 20:22:28 +08:00
|
|
|
AuxTranslationDirection auxTranslationDirection = AuxTranslationDirection::None;
|
2019-06-26 17:37:46 +08:00
|
|
|
|
2019-06-27 22:08:20 +08:00
|
|
|
GraphicsAllocation *dstAllocation = nullptr;
|
|
|
|
GraphicsAllocation *srcAllocation = nullptr;
|
2020-11-19 07:58:42 +08:00
|
|
|
GraphicsAllocation *clearColorAllocation = nullptr;
|
2019-12-12 17:47:28 +08:00
|
|
|
uint64_t dstGpuAddress = 0;
|
|
|
|
uint64_t srcGpuAddress = 0;
|
2020-02-25 16:55:13 +08:00
|
|
|
|
|
|
|
Vec3<size_t> copySize = 0;
|
|
|
|
Vec3<size_t> dstOffset = 0;
|
|
|
|
Vec3<size_t> srcOffset = 0;
|
|
|
|
|
|
|
|
size_t dstRowPitch = 0;
|
|
|
|
size_t dstSlicePitch = 0;
|
|
|
|
size_t srcRowPitch = 0;
|
|
|
|
size_t srcSlicePitch = 0;
|
2021-06-07 21:58:03 +08:00
|
|
|
Vec3<size_t> dstSize = 0;
|
|
|
|
Vec3<size_t> srcSize = 0;
|
2020-05-21 18:36:23 +08:00
|
|
|
size_t bytesPerPixel = 0;
|
2019-06-26 17:37:46 +08:00
|
|
|
};
|
2019-04-03 21:59:31 +08:00
|
|
|
|
2020-07-10 23:04:42 +08:00
|
|
|
enum class BlitOperationResult {
|
|
|
|
Unsupported,
|
|
|
|
Fail,
|
|
|
|
Success
|
|
|
|
};
|
|
|
|
|
|
|
|
namespace BlitHelperFunctions {
|
2020-09-15 21:45:26 +08:00
|
|
|
using BlitMemoryToAllocationFunc = std::function<BlitOperationResult(const Device &device,
|
2020-07-10 23:04:42 +08:00
|
|
|
GraphicsAllocation *memory,
|
|
|
|
size_t offset,
|
|
|
|
const void *hostPtr,
|
|
|
|
Vec3<size_t> size)>;
|
|
|
|
extern BlitMemoryToAllocationFunc blitMemoryToAllocation;
|
|
|
|
} // namespace BlitHelperFunctions
|
|
|
|
|
|
|
|
struct BlitHelper {
|
2020-09-15 21:45:26 +08:00
|
|
|
static BlitOperationResult blitMemoryToAllocation(const Device &device, GraphicsAllocation *memory, size_t offset, const void *hostPtr,
|
2020-07-10 23:04:42 +08:00
|
|
|
Vec3<size_t> size);
|
2021-02-17 01:04:00 +08:00
|
|
|
static BlitOperationResult blitMemoryToAllocationBanks(const Device &device, GraphicsAllocation *memory, size_t offset, const void *hostPtr,
|
|
|
|
Vec3<size_t> size, DeviceBitfield memoryBanks);
|
2020-07-10 23:04:42 +08:00
|
|
|
};
|
|
|
|
|
2019-04-03 21:59:31 +08:00
|
|
|
template <typename GfxFamily>
|
|
|
|
struct BlitCommandsHelper {
|
2020-04-28 16:24:22 +08:00
|
|
|
using COLOR_DEPTH = typename GfxFamily::XY_COLOR_BLT::COLOR_DEPTH;
|
2020-07-01 20:12:53 +08:00
|
|
|
static uint64_t getMaxBlitWidth(const RootDeviceEnvironment &rootDeviceEnvironment);
|
|
|
|
static uint64_t getMaxBlitWidthOverride(const RootDeviceEnvironment &rootDeviceEnvironment);
|
|
|
|
static uint64_t getMaxBlitHeight(const RootDeviceEnvironment &rootDeviceEnvironment);
|
|
|
|
static uint64_t getMaxBlitHeightOverride(const RootDeviceEnvironment &rootDeviceEnvironment);
|
2021-01-28 18:01:51 +08:00
|
|
|
static void dispatchPreBlitCommand(LinearStream &linearStream);
|
|
|
|
static size_t estimatePreBlitCommandSize();
|
2020-05-06 20:54:30 +08:00
|
|
|
static void dispatchPostBlitCommand(LinearStream &linearStream);
|
|
|
|
static size_t estimatePostBlitCommandSize();
|
2020-08-25 21:24:09 +08:00
|
|
|
static size_t estimateBlitCommandsSize(const Vec3<size_t> ©Size, const CsrDependencies &csrDependencies, bool updateTimestampPacket,
|
2020-07-01 20:12:53 +08:00
|
|
|
bool profilingEnabled, const RootDeviceEnvironment &rootDeviceEnvironment);
|
|
|
|
static size_t estimateBlitCommandsSize(const BlitPropertiesContainer &blitPropertiesContainer, bool profilingEnabled,
|
2020-10-19 21:36:57 +08:00
|
|
|
bool debugPauseEnabled, bool blitterDirectSubmission, const RootDeviceEnvironment &rootDeviceEnvironment);
|
2020-08-25 21:24:09 +08:00
|
|
|
static size_t getNumberOfBlitsForCopyRegion(const Vec3<size_t> ©Size, const RootDeviceEnvironment &rootDeviceEnvironment);
|
|
|
|
static size_t getNumberOfBlitsForCopyPerRow(const Vec3<size_t> ©Size, const RootDeviceEnvironment &rootDeviceEnvironment);
|
2020-02-25 16:55:13 +08:00
|
|
|
static uint64_t calculateBlitCommandDestinationBaseAddress(const BlitProperties &blitProperties, uint64_t offset, uint64_t row, uint64_t slice);
|
|
|
|
static uint64_t calculateBlitCommandSourceBaseAddress(const BlitProperties &blitProperties, uint64_t offset, uint64_t row, uint64_t slice);
|
2020-08-25 21:24:09 +08:00
|
|
|
static uint64_t calculateBlitCommandDestinationBaseAddressCopyRegion(const BlitProperties &blitProperties, size_t slice);
|
|
|
|
static uint64_t calculateBlitCommandSourceBaseAddressCopyRegion(const BlitProperties &blitProperties, size_t slice);
|
|
|
|
static void dispatchBlitCommands(const BlitProperties &blitProperties, LinearStream &linearStream, const RootDeviceEnvironment &rootDeviceEnvironment);
|
|
|
|
static void dispatchBlitCommandsForBufferRegion(const BlitProperties &blitProperties, LinearStream &linearStream, const RootDeviceEnvironment &rootDeviceEnvironment);
|
2020-07-02 22:07:22 +08:00
|
|
|
static void dispatchBlitCommandsForBufferPerRow(const BlitProperties &blitProperties, LinearStream &linearStream, const RootDeviceEnvironment &rootDeviceEnvironment);
|
|
|
|
static void dispatchBlitCommandsRegion(const BlitProperties &blitProperties, LinearStream &linearStream, const RootDeviceEnvironment &rootDeviceEnvironment);
|
2020-04-28 16:24:22 +08:00
|
|
|
static void dispatchBlitMemoryColorFill(NEO::GraphicsAllocation *dstAlloc, uint32_t *pattern, size_t patternSize, LinearStream &linearStream, size_t size, const RootDeviceEnvironment &rootDeviceEnvironment);
|
|
|
|
template <size_t patternSize>
|
|
|
|
static void dispatchBlitMemoryFill(NEO::GraphicsAllocation *dstAlloc, uint32_t *pattern, LinearStream &linearStream, size_t size, const RootDeviceEnvironment &rootDeviceEnvironment, COLOR_DEPTH depth);
|
2020-02-10 21:17:12 +08:00
|
|
|
static void appendBlitCommandsForBuffer(const BlitProperties &blitProperties, typename GfxFamily::XY_COPY_BLT &blitCmd, const RootDeviceEnvironment &rootDeviceEnvironment);
|
2020-10-20 21:27:49 +08:00
|
|
|
static void appendBlitCommandsForImages(const BlitProperties &blitProperties, typename GfxFamily::XY_COPY_BLT &blitCmd, const RootDeviceEnvironment &rootDeviceEnvironment, uint32_t &srcSlicePitch, uint32_t &dstSlicePitch);
|
2020-11-26 00:09:44 +08:00
|
|
|
static void appendExtraMemoryProperties(typename GfxFamily::XY_COPY_BLT &blitCmd, const RootDeviceEnvironment &rootDeviceEnvironment);
|
|
|
|
static void appendExtraMemoryProperties(typename GfxFamily::XY_COLOR_BLT &blitCmd, const RootDeviceEnvironment &rootDeviceEnvironment);
|
2020-05-21 18:36:23 +08:00
|
|
|
static void appendColorDepth(const BlitProperties &blitProperties, typename GfxFamily::XY_COPY_BLT &blitCmd);
|
2020-04-28 16:24:22 +08:00
|
|
|
static void appendBlitCommandsForFillBuffer(NEO::GraphicsAllocation *dstAlloc, typename GfxFamily::XY_COLOR_BLT &blitCmd, const RootDeviceEnvironment &rootDeviceEnvironment);
|
2020-05-21 18:36:23 +08:00
|
|
|
static void appendSurfaceType(const BlitProperties &blitProperties, typename GfxFamily::XY_COPY_BLT &blitCmd);
|
2020-04-28 16:24:22 +08:00
|
|
|
static void appendTilingEnable(typename GfxFamily::XY_COLOR_BLT &blitCmd);
|
2020-05-21 18:36:23 +08:00
|
|
|
static void appendTilingType(const GMM_TILE_TYPE srcTilingType, const GMM_TILE_TYPE dstTilingType, typename GfxFamily::XY_COPY_BLT &blitCmd);
|
2020-10-20 21:27:49 +08:00
|
|
|
static void appendSliceOffsets(const BlitProperties &blitProperties, typename GfxFamily::XY_COPY_BLT &blitCmd, uint32_t sliceIndex, const RootDeviceEnvironment &rootDeviceEnvironment, uint32_t srcSlicePitch, uint32_t dstSlicePitch);
|
|
|
|
static void getBlitAllocationProperties(const GraphicsAllocation &allocation, uint32_t &pitch, uint32_t &qPitch, GMM_TILE_TYPE &tileType, uint32_t &mipTailLod, uint32_t &compressionDetails, const RootDeviceEnvironment &rootDeviceEnvironment);
|
2020-06-17 20:58:28 +08:00
|
|
|
static void dispatchDebugPauseCommands(LinearStream &commandStream, uint64_t debugPauseStateGPUAddress, DebugPauseState confirmationTrigger, DebugPauseState waitCondition);
|
|
|
|
static size_t getSizeForDebugPauseCommands();
|
2020-07-02 22:07:22 +08:00
|
|
|
static bool useOneBlitCopyCommand(Vec3<size_t> copySize, uint32_t bytesPerPixel);
|
2021-06-07 21:58:03 +08:00
|
|
|
static uint32_t getAvailableBytesPerPixel(size_t copySize, uint32_t srcOrigin, uint32_t dstOrigin, size_t srcSize, size_t dstSize);
|
2020-08-25 21:24:09 +08:00
|
|
|
static bool isCopyRegionPreferred(const Vec3<size_t> ©Size, const RootDeviceEnvironment &rootDeviceEnvironment);
|
2020-10-16 21:58:47 +08:00
|
|
|
static void programGlobalSequencerFlush(LinearStream &commandStream);
|
|
|
|
static size_t getSizeForGlobalSequencerFlush();
|
2020-11-17 01:12:08 +08:00
|
|
|
static bool miArbCheckWaRequired();
|
2021-01-28 18:01:51 +08:00
|
|
|
static bool preBlitCommandWARequired();
|
2020-11-19 07:58:42 +08:00
|
|
|
static void appendClearColor(const BlitProperties &blitProperties, typename GfxFamily::XY_COPY_BLT &blitCmd);
|
2021-04-01 19:54:16 +08:00
|
|
|
|
|
|
|
static void encodeProfilingStartMmios(LinearStream &cmdStream, const TagNodeBase ×tampPacketNode);
|
|
|
|
static void encodeProfilingEndMmios(LinearStream &cmdStream, const TagNodeBase ×tampPacketNode);
|
|
|
|
static size_t getProfilingMmioCmdsSize();
|
2019-04-03 21:59:31 +08:00
|
|
|
};
|
|
|
|
} // namespace NEO
|