1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
/*
* Copyright (C) 2018-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#pragma once
#include "shared/source/command_container/cmdcontainer.h"
#include "shared/source/command_stream/csr_definitions.h"
#include "shared/source/command_stream/task_count_helper.h"
#include "shared/source/helpers/non_copyable_or_moveable.h"
#include "shared/source/helpers/pipe_control_args.h"
#include "shared/source/utilities/idlist.h"
#include <vector>
namespace NEO {
class Device;
class Event;
class FlushStampTracker;
class GraphicsAllocation;
struct PagingFenceSemaphoreInfo {
bool requiresBlockingResidencyHandling = true;
uint64_t pagingFenceValue = 0u;
bool requiresProgrammingSemaphore() {
return !requiresBlockingResidencyHandling && pagingFenceValue > 0u;
}
};
struct BatchBuffer {
BatchBuffer(GraphicsAllocation *commandBufferAllocation,
size_t startOffset,
size_t chainedBatchBufferStartOffset,
uint64_t taskStartAddress,
GraphicsAllocation *chainedBatchBuffer,
bool lowPriority,
QueueThrottle throttle,
uint64_t sliceCount,
size_t usedSize,
LinearStream *stream,
void *endCmdPtr,
uint32_t numCsrClients,
bool hasStallingCmds,
bool hasRelaxedOrderingDependencies,
bool dispatchMonitorFence,
bool taskCountUpdateOnly);
BatchBuffer() {}
GraphicsAllocation *commandBufferAllocation = nullptr;
ResidencyContainer *allocationsForResidency = nullptr;
size_t startOffset = 0u;
size_t chainedBatchBufferStartOffset = 0u;
uint64_t taskStartAddress = 0; // if task not available, use CSR stream
GraphicsAllocation *chainedBatchBuffer = nullptr;
bool lowPriority = false;
QueueThrottle throttle = QueueThrottle::MEDIUM;
uint64_t sliceCount = QueueSliceCount::defaultSliceCount;
size_t usedSize = 0u;
// only used in drm csr in gem close worker active mode
LinearStream *stream = nullptr;
void *endCmdPtr = nullptr;
uint32_t numCsrClients = 0;
PagingFenceSemaphoreInfo pagingFenceSemInfo{};
bool hasStallingCmds = false;
bool hasRelaxedOrderingDependencies = false;
bool disableFlatRingBuffer = false;
bool dispatchMonitorFence = false;
bool taskCountUpdateOnly = false;
};
struct CommandBuffer : public IDNode<CommandBuffer>, NEO::NonCopyableAndNonMovableClass {
CommandBuffer(Device &device);
~CommandBuffer() override;
ResidencyContainer surfaces;
BatchBuffer batchBuffer;
void *batchBufferEndLocation = nullptr;
uint32_t inspectionId = 0;
TaskCountType taskCount = 0u;
void *pipeControlThatMayBeErasedLocation = nullptr;
void *epiloguePipeControlLocation = nullptr;
PipeControlArgs epiloguePipeControlArgs;
std::unique_ptr<FlushStampTracker> flushStamp;
Device &device;
};
static_assert(NEO::NonCopyableAndNonMovable<CommandBuffer>);
struct CommandBufferList : public IDList<CommandBuffer, false, true, false> {};
using ResourcePackage = StackVec<GraphicsAllocation *, 128>;
class SubmissionAggregator {
public:
void recordCommandBuffer(CommandBuffer *commandBuffer);
void aggregateCommandBuffers(ResourcePackage &resourcePackage, size_t &totalUsedSize, size_t totalMemoryBudget, uint32_t osContextId);
CommandBufferList &peekCmdBufferList() { return cmdBuffers; }
protected:
CommandBufferList cmdBuffers;
uint32_t inspectionId = 1;
};
} // namespace NEO
|