P4 to Git Change 1184379 by gandryey@gera-dev-w7 on 2015/08/25 13:11:13
ECR #304775 - Remove the passthrough interfaces from CALGSLContext
Affected files ...
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpucounters.cpp#11 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpukernel.cpp#293 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpukernel.hpp#114 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuresource.cpp#224 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gputhreadtrace.cpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gputhreadtrace.hpp#6 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gputimestamp.cpp#26 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuvirtual.cpp#374 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuvirtual.hpp#132 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gslbe/src/rt/GSLContext.cpp#77 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gslbe/src/rt/GSLContext.h#49 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gslbe/src/rt/backend.h#9 edit
[ROCm/clr commit: 727fc38bbb]
Tento commit je obsažen v:
@@ -5,6 +5,7 @@
|
||||
#include "device/gpu/gpudefs.hpp"
|
||||
#include "device/gpu/gpucounters.hpp"
|
||||
#include "device/gpu/gpuvirtual.hpp"
|
||||
#include "query/PerformanceQueryObject.h"
|
||||
|
||||
namespace gpu {
|
||||
|
||||
@@ -14,7 +15,7 @@ CalCounterReference::~CalCounterReference() {
|
||||
amd::ScopedLock lock(gpu_.execution());
|
||||
|
||||
if (0 != counter_) {
|
||||
gpu().destroyCounter(gslCounter());
|
||||
gpu().cs()->destroyQuery(gslCounter());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +53,7 @@ PerfCounter::create(
|
||||
calRef->growResultArray(index_);
|
||||
|
||||
// Initialize the counter
|
||||
gpu().configPerformanceCounter(gslCounter(),
|
||||
gslCounter()->getAsPerformanceQueryObject()->setCounterState(
|
||||
info()->blockIndex_, info()->counterIndex_, info()->eventIndex_);
|
||||
|
||||
return true;
|
||||
@@ -75,7 +76,7 @@ PerfCounter::getInfo(uint64_t infoType) const
|
||||
return info()->eventIndex_;
|
||||
}
|
||||
case CL_PERFCOUNTER_DATA: {
|
||||
gpu().getCounter(reinterpret_cast<uint64*>(calRef_->results()), gslCounter());
|
||||
gslCounter()->GetResult(gpu().cs(), reinterpret_cast<uint64*>(calRef_->results()));
|
||||
return calRef_->results()[index_];
|
||||
}
|
||||
default:
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "device/gpu/gpuconstbuf.hpp"
|
||||
#include "device/gpu/gpusched.hpp"
|
||||
#include "platform/commandqueue.hpp"
|
||||
#include "shader/ComputeProgramObject.h"
|
||||
#include "utils/options.hpp"
|
||||
|
||||
#include "acl.h"
|
||||
@@ -769,6 +770,7 @@ NullKernel::create(
|
||||
workGroupInfo_.usedLDSSize_ = calFuncInfo.LDSSizeUsed;
|
||||
workGroupInfo_.availableStackSize_ = calFuncInfo.stackSizeAvailable;
|
||||
workGroupInfo_.usedStackSize_ = calFuncInfo.stackSizeUsed;
|
||||
setBufferForNumGroup_ = calFuncInfo.setBufferForNumGroup;
|
||||
|
||||
device::Kernel::parameters_t params;
|
||||
if (!createSignature(params)) {
|
||||
@@ -1655,7 +1657,7 @@ bool
|
||||
Kernel::run(VirtualGPU& gpu, GpuEvent* calEvent, bool lastRun) const
|
||||
{
|
||||
// 8xx workaround for the number of groups limit in HW
|
||||
if (gpu.gslKernelDesc()->funcInfo_.setBufferForNumGroup) {
|
||||
if (setBufferForNumGroup_) {
|
||||
const ProgramGrid* programGrid = &gpu.cal()->progGrid_;
|
||||
ConstBuffer* cb = gpu.numGrpCb();
|
||||
assert((cb != NULL) && "Runtime must have the constant buffer");
|
||||
@@ -1682,12 +1684,13 @@ Kernel::run(VirtualGPU& gpu, GpuEvent* calEvent, bool lastRun) const
|
||||
}
|
||||
}
|
||||
|
||||
gpu.setWavesPerSH(gpu.gslKernelDesc()->func_, waveLimiter_.getWavesPerSH(&gpu));
|
||||
if (!gpu.runProgramGrid(*calEvent,
|
||||
const_cast<ProgramGrid*>(&gpu.cal()->progGrid_), gpu.vmMems(), gpu.cal_.memCount_)) {
|
||||
LogError("Failed to execute the program!");
|
||||
return false;
|
||||
}
|
||||
auto compProg = static_cast<gsl::ComputeProgramObject*>(gpu.gslKernelDesc()->func_);
|
||||
compProg->setWavesPerSH(waveLimiter_.getWavesPerSH(&gpu));
|
||||
|
||||
gpu.eventBegin(MainEngine);
|
||||
gpu.rs()->Dispatch(gpu.cs(), &gpu.cal()->progGrid_.gridBlock, &gpu.cal()->progGrid_.partialGridBlock,
|
||||
&gpu.cal()->progGrid_.gridSize, gpu.cal()->progGrid_.localSize, gpu.vmMems(), gpu.cal_.memCount_);
|
||||
gpu.eventEnd(MainEngine, *calEvent);
|
||||
|
||||
// Unbind all resources
|
||||
unbindResources(gpu, *calEvent, lastRun);
|
||||
@@ -2331,11 +2334,13 @@ Kernel::bindResource(
|
||||
GpuEvent calEvent;
|
||||
|
||||
// Bind memory with atomic counter
|
||||
gpu.bindAtomicCounter(argument(paramIdx)->index_,
|
||||
gpu.cs()->bindAtomicCounter(argument(paramIdx)->index_,
|
||||
memory->gslResource());
|
||||
|
||||
// Copy the counter value into GDS
|
||||
gpu.syncAtomicCounter(calEvent, argument(paramIdx)->index_, false);
|
||||
gpu.eventBegin(MainEngine);
|
||||
gpu.cs()->syncAtomicCounter(argument(paramIdx)->index_, false);
|
||||
gpu.eventEnd(MainEngine, calEvent);
|
||||
|
||||
// Mark resource as busy
|
||||
memory->setBusy(gpu, calEvent);
|
||||
@@ -2455,7 +2460,9 @@ Kernel::unbindResources(
|
||||
|
||||
if (KernelArg::Counter == argument(i)->type_) {
|
||||
// Copy the counter value from GDS
|
||||
gpu.syncAtomicCounter(calEventTmp, argument(i)->index_, true);
|
||||
gpu.eventBegin(MainEngine);
|
||||
gpu.cs()->syncAtomicCounter(argument(i)->index_, true);
|
||||
gpu.eventEnd(MainEngine, calEventTmp);
|
||||
}
|
||||
else if (!(gpu.slots_[i].state_.constant_ ||
|
||||
argument(i)->memory_.readOnly_)) {
|
||||
@@ -2487,7 +2494,7 @@ Kernel::unbindResources(
|
||||
}
|
||||
|
||||
// 8xx workaround for the number of groups limit in HW
|
||||
if (gpu.gslKernelDesc()->funcInfo_.setBufferForNumGroup) {
|
||||
if (setBufferForNumGroup_) {
|
||||
ConstBuffer* cb = gpu.numGrpCb();
|
||||
assert((cb != NULL) && "Runtime must have the constant buffer");
|
||||
cb->setBusy(gpu, calEvent);
|
||||
|
||||
@@ -505,6 +505,7 @@ protected:
|
||||
uint uavArena_; //!< UAV used for arena access
|
||||
|
||||
bool rwAttributes_; //!< backend provides RW attributes for arguments
|
||||
bool setBufferForNumGroup_;
|
||||
|
||||
uint instructionCnt_;//!< Instruction count
|
||||
|
||||
|
||||
@@ -1181,7 +1181,9 @@ Resource::writeRawData(
|
||||
// Write data size bytes to surface
|
||||
// size needs to be DWORD aligned
|
||||
assert((size & 3) == 0);
|
||||
gpu.writeSurfRaw(event, gslResource(), size, data);
|
||||
gpu.eventBegin(MainEngine);
|
||||
gslResource()->writeDataRaw(gpu.cs(), size, data, true);
|
||||
gpu.eventEnd(MainEngine, event);
|
||||
|
||||
setBusy(gpu, event);
|
||||
// Update the global GPU event
|
||||
|
||||
@@ -13,7 +13,7 @@ CalThreadTraceReference::~CalThreadTraceReference() {
|
||||
amd::ScopedLock lock(gpu_.execution());
|
||||
|
||||
if (0 != threadTrace_) {
|
||||
//gpu().destroyThreadTrace(gslThreadTrace());
|
||||
//gpu().cs()->destroyQuery(gslThreadTrace());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,7 +24,8 @@ ThreadTrace::~ThreadTrace()
|
||||
return;
|
||||
}
|
||||
for(uint i = 0; i < amdThreadTraceMemObjsNum_;++i) {
|
||||
gpu().DestroyThreadTraceBuffer(threadTraceBufferObjs_[i],i);
|
||||
threadTraceBufferObjs_[i]->attachMemObject(gpu().cs(), NULL, 0, 0, 0, i);
|
||||
gpu().cs()->destroyShaderTraceBuffer(threadTraceBufferObjs_[i]);
|
||||
}
|
||||
|
||||
// Release the thread trace reference object
|
||||
@@ -52,7 +53,7 @@ ThreadTrace::info(uint infoType, uint* info, uint infoSize) const
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
gpu().getThreadTraceQueryRes(gslThreadTrace(), info);
|
||||
gslThreadTrace()->GetResultAll(gpu().cs(), info);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "top.hpp"
|
||||
#include "device/device.hpp"
|
||||
#include "device/gpu/gpudevice.hpp"
|
||||
#include "shadertracebuffer/ShaderTraceBufferObject.h"
|
||||
|
||||
#include <vector>
|
||||
namespace gpu {
|
||||
@@ -76,7 +77,7 @@ public:
|
||||
{
|
||||
threadTraceBufferObjs_ = new gslShaderTraceBufferObject[amdThreadTraceMemObjsNum];
|
||||
for (uint i = 0; i < amdThreadTraceMemObjsNum;++i) {
|
||||
threadTraceBufferObjs_[i] = gpu.CreateThreadTraceBuffer();
|
||||
threadTraceBufferObjs_[i] = gpu.cs()->createShaderTraceBuffer();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ void
|
||||
TimeStamp::begin(bool sdma)
|
||||
{
|
||||
if (!flags_.beginIssued_) {
|
||||
gpu().writeTimer(sdma, gslMem_,
|
||||
gpu().rs()->writeTimer(gpu().cs(), sdma, gslMem_,
|
||||
memOffset_ + CommandStartTime * sizeof(uint64_t));
|
||||
flags_.beginIssued_ = true;
|
||||
}
|
||||
@@ -41,7 +41,7 @@ void
|
||||
TimeStamp::end(bool sdma)
|
||||
{
|
||||
CondLog(!flags_.beginIssued_, "We didn't issue a begin operation!");
|
||||
gpu().writeTimer(sdma, gslMem_,
|
||||
gpu().rs()->writeTimer(gpu().cs(), sdma, gslMem_,
|
||||
memOffset_ + CommandEndTime * sizeof(uint64_t));
|
||||
flags_.endIssued_ = true;
|
||||
flags_.sdma_ = sdma;
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "device/gpu/gputimestamp.hpp"
|
||||
#include "device/gpu/gpublit.hpp"
|
||||
#include "device/gpu/gpudebugger.hpp"
|
||||
#include "shader/ComputeProgramObject.h"
|
||||
#include "hsa.h"
|
||||
#include "amd_hsa_kernel_code.h"
|
||||
#include "amd_hsa_queue.h"
|
||||
@@ -1807,8 +1808,10 @@ VirtualGPU::submitKernelInternalHSA(
|
||||
|
||||
GpuEvent gpuEvent;
|
||||
// Run AQL dispatch in HW
|
||||
runAqlDispatch(gpuEvent, aqlPkt, vmMems(), cal_.memCount_,
|
||||
scratch, scratchOffset, hsaKernel.cpuAqlCode(), hsaQueueMem_->vmAddress(), pKernelInfo);
|
||||
eventBegin(MainEngine);
|
||||
cs()->AqlDispatch(aqlPkt, vmMems(), cal_.memCount_, scratch, scratchOffset,
|
||||
hsaKernel.cpuAqlCode(), hsaQueueMem_->vmAddress(), pKernelInfo);
|
||||
eventEnd(MainEngine, gpuEvent);
|
||||
|
||||
if (dbgManager && (NULL != dbgManager->postDispatchCallBackFunc())) {
|
||||
dbgManager->executePostDispatchCallBack();
|
||||
@@ -1908,14 +1911,16 @@ VirtualGPU::submitKernelInternalHSA(
|
||||
|
||||
if (!dev().settings().useDeviceQueue_) {
|
||||
// Add the termination handshake to the host queue
|
||||
virtualQueueHandshake(gpuEvent, gpuDefQueue->schedParams_->gslResource(),
|
||||
eventBegin(MainEngine);
|
||||
cs()->VirtualQueueHandshake(gpuDefQueue->schedParams_->gslResource(),
|
||||
vmParentWrap + offsetof(AmdAqlWrap, state), AQL_WRAP_DONE,
|
||||
vmParentWrap + offsetof(AmdAqlWrap, child_counter),
|
||||
0, dev().settings().useDeviceQueue_);
|
||||
eventEnd(MainEngine, gpuEvent);
|
||||
}
|
||||
|
||||
// Get the global loop start before the scheduler
|
||||
mcaddr loopStart = gpuDefQueue->virtualQueueDispatcherStart();
|
||||
mcaddr loopStart = gpuDefQueue->cs()->VirtualQueueDispatcherStart();
|
||||
static_cast<KernelBlitManager&>(gpuDefQueue->blitMgr()).runScheduler(
|
||||
*gpuDefQueue->virtualQueue_,
|
||||
*gpuDefQueue->schedParams_, gpuDefQueue->schedParamIdx_,
|
||||
@@ -1925,7 +1930,7 @@ VirtualGPU::submitKernelInternalHSA(
|
||||
|
||||
// Get the address of PM4 template and add write it to params
|
||||
//! @note DMA flush must not occur between patch and the scheduler
|
||||
mcaddr patchStart = gpuDefQueue->virtualQueueDispatcherStart();
|
||||
mcaddr patchStart = gpuDefQueue->cs()->VirtualQueueDispatcherStart();
|
||||
|
||||
// Program parameters for the scheduler
|
||||
SchedulerParam* param = &reinterpret_cast<SchedulerParam*>
|
||||
@@ -1967,10 +1972,12 @@ VirtualGPU::submitKernelInternalHSA(
|
||||
|
||||
mcaddr signalAddr = gpuDefQueue->schedParams_->vmAddress() +
|
||||
gpuDefQueue->schedParamIdx_ * sizeof(SchedulerParam);
|
||||
gpuDefQueue->virtualQueueDispatcherEnd(gpuEvent,
|
||||
gpuDefQueue->eventBegin(MainEngine);
|
||||
gpuDefQueue->cs()->VirtualQueueDispatcherEnd(
|
||||
gpuDefQueue->vmMems(), gpuDefQueue->cal_.memCount_,
|
||||
signalAddr, loopStart, gpuDefQueue->vqHeader_->aql_slot_num /
|
||||
(DeviceQueueMaskSize * maskGroups_));
|
||||
gpuDefQueue->eventEnd(MainEngine, gpuEvent);
|
||||
|
||||
// Set GPU event for the used resources
|
||||
for (uint i = 0; i < memList.size(); ++i) {
|
||||
@@ -1979,10 +1986,12 @@ VirtualGPU::submitKernelInternalHSA(
|
||||
|
||||
if (dev().settings().useDeviceQueue_) {
|
||||
// Add the termination handshake to the host queue
|
||||
virtualQueueHandshake(gpuEvent, gpuDefQueue->schedParams_->gslResource(),
|
||||
eventBegin(MainEngine);
|
||||
cs()->VirtualQueueHandshake(gpuDefQueue->schedParams_->gslResource(),
|
||||
vmParentWrap + offsetof(AmdAqlWrap, state), AQL_WRAP_DONE,
|
||||
vmParentWrap + offsetof(AmdAqlWrap, child_counter),
|
||||
signalAddr, dev().settings().useDeviceQueue_);
|
||||
eventEnd(MainEngine, gpuEvent);
|
||||
}
|
||||
|
||||
++gpuDefQueue->schedParamIdx_ %=
|
||||
@@ -2275,7 +2284,7 @@ VirtualGPU::submitPerfCounter(amd::PerfCounterCommand& vcmd)
|
||||
const amd::PerfCounterCommand::PerfCounterList counters = vcmd.getCounters();
|
||||
|
||||
// Create a HW counter
|
||||
gslCounter = createCounter(GSL_PERFORMANCE_COUNTERS_ATI);
|
||||
gslCounter = cs()->createQuery(GSL_PERFORMANCE_COUNTERS_ATI);
|
||||
if (0 == gslCounter) {
|
||||
LogError("We failed to allocate memory for the GPU perfcounter");
|
||||
vcmd.setStatus(CL_INVALID_OPERATION);
|
||||
@@ -2338,11 +2347,13 @@ VirtualGPU::submitPerfCounter(amd::PerfCounterCommand& vcmd)
|
||||
gslCounter = counter->gslCounter();
|
||||
// Find the state and sends the command to CAL
|
||||
if (vcmd.getState() == amd::PerfCounterCommand::Begin) {
|
||||
beginCounter(gslCounter, GSL_PERFORMANCE_COUNTERS_ATI);
|
||||
gslCounter->BeginQuery(cs(), GSL_PERFORMANCE_COUNTERS_ATI, 0);
|
||||
}
|
||||
else if (vcmd.getState() == amd::PerfCounterCommand::End) {
|
||||
GpuEvent event;
|
||||
endCounter(gslCounter, event);
|
||||
eventBegin(MainEngine);
|
||||
gslCounter->EndQuery(cs(), 0);
|
||||
eventEnd(MainEngine, event);
|
||||
setGpuEvent(event);
|
||||
}
|
||||
else {
|
||||
@@ -2371,7 +2382,7 @@ VirtualGPU::submitThreadTraceMemObjects(amd::ThreadTraceMemObjectsCommand& cmd)
|
||||
if (threadTrace == NULL) {
|
||||
gslQueryObject gslThreadTrace;
|
||||
// Create a HW thread trace query object
|
||||
gslThreadTrace = createThreadTrace();
|
||||
gslThreadTrace = cs()->createQuery(GSL_SHADER_TRACE_BYTES_WRITTEN);
|
||||
if (0 == gslThreadTrace) {
|
||||
LogError("Failure in memory allocation for the GPU threadtrace");
|
||||
cmd.setStatus(CL_INVALID_OPERATION);
|
||||
@@ -2414,7 +2425,7 @@ VirtualGPU::submitThreadTraceMemObjects(amd::ThreadTraceMemObjectsCommand& cmd)
|
||||
gslMemObject gslMemObj = dev().getGpuMemory(*itMemObj)->gslResource();
|
||||
|
||||
// Bind GSL MemObject to the appropriate SE Thread Trace Buffer Object
|
||||
configMemThreadTrace(threadTraceBufferObjects[se],gslMemObj,se,memObjSize);
|
||||
threadTraceBufferObjects[se]->attachMemObject(cs(), gslMemObj, 0, 0, memObjSize, se);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2448,45 +2459,47 @@ VirtualGPU::submitThreadTrace(amd::ThreadTraceCommand& cmd)
|
||||
else {
|
||||
gslQueryObject gslThreadTrace;
|
||||
gslThreadTrace = threadTrace->gslThreadTrace();
|
||||
// Find the state and sends the command to CAL
|
||||
if (cmd.getState() == amd::ThreadTraceCommand::Begin) {
|
||||
size_t amdMemObjsNumThreadTrace = amdThreadTrace->deviceSeNumThreadTrace();
|
||||
amd::ThreadTrace::ThreadTraceConfig* amdThreadTraceConfig =
|
||||
static_cast<amd::ThreadTrace::ThreadTraceConfig*>(cmd.threadTraceConfig());
|
||||
CALthreadTraceConfig calTthreadTraceConfig;
|
||||
uint32_t seNum = amdThreadTrace->deviceSeNumThreadTrace();
|
||||
|
||||
calTthreadTraceConfig.cu = amdThreadTraceConfig->cu_;
|
||||
calTthreadTraceConfig.sh = amdThreadTraceConfig->sh_;
|
||||
calTthreadTraceConfig.simd_mask = amdThreadTraceConfig->simdMask_;
|
||||
calTthreadTraceConfig.vm_id_mask = amdThreadTraceConfig->vmIdMask_;
|
||||
calTthreadTraceConfig.token_mask = amdThreadTraceConfig->tokenMask_;
|
||||
calTthreadTraceConfig.reg_mask = amdThreadTraceConfig->regMask_;
|
||||
calTthreadTraceConfig.inst_mask = amdThreadTraceConfig->instMask_;
|
||||
calTthreadTraceConfig.random_seed = amdThreadTraceConfig->randomSeed_;
|
||||
calTthreadTraceConfig.user_data = amdThreadTraceConfig->userData_;
|
||||
calTthreadTraceConfig.capture_mode = amdThreadTraceConfig->captureMode_;
|
||||
if (amdThreadTraceConfig->isUserData_) {
|
||||
calTthreadTraceConfig.is_user_data = CAL_TRUE;
|
||||
// Find the state and sends the commands to GSL
|
||||
if (cmd.getState() == amd::ThreadTraceCommand::Begin) {
|
||||
amd::ThreadTrace::ThreadTraceConfig* traceCfg =
|
||||
static_cast<amd::ThreadTrace::ThreadTraceConfig*>(cmd.threadTraceConfig());
|
||||
const gslErrorCode ec = gslThreadTrace->BeginQuery(cs(),
|
||||
GSL_SHADER_TRACE_BYTES_WRITTEN, 0);
|
||||
assert(ec == GSL_NO_ERROR);
|
||||
|
||||
for (uint32_t idx = 0; idx < seNum; ++idx) {
|
||||
rs()->enableShaderTrace(cs(), idx, true);
|
||||
rs()->setShaderTraceComputeUnit (idx, traceCfg->cu_);
|
||||
rs()->setShaderTraceShaderArray (idx, traceCfg->sh_);
|
||||
rs()->setShaderTraceSIMDMask (idx, traceCfg->simdMask_);
|
||||
rs()->setShaderTraceVmIdMask (idx, traceCfg->vmIdMask_);
|
||||
rs()->setShaderTraceTokenMask (idx, traceCfg->tokenMask_);
|
||||
rs()->setShaderTraceRegisterMask(idx, traceCfg->regMask_);
|
||||
rs()->setShaderTraceIssueMask (idx, traceCfg->instMask_);
|
||||
rs()->setShaderTraceRandomSeed (idx, traceCfg->randomSeed_);
|
||||
rs()->setShaderTraceCaptureMode (idx, traceCfg->captureMode_);
|
||||
rs()->setShaderTraceWrap (idx, traceCfg->isWrapped_);
|
||||
rs()->setShaderTraceUserData (idx,
|
||||
(traceCfg->isUserData_) ? traceCfg->userData_ : 0);
|
||||
}
|
||||
else {
|
||||
calTthreadTraceConfig.is_user_data = CAL_FALSE;
|
||||
}
|
||||
if (amdThreadTraceConfig->isWrapped_) {
|
||||
calTthreadTraceConfig.is_wrapped = CAL_TRUE;
|
||||
}
|
||||
else {
|
||||
calTthreadTraceConfig.is_wrapped = CAL_FALSE;
|
||||
}
|
||||
beginThreadTrace(gslThreadTrace,0,GSL_SHADER_TRACE_BYTES_WRITTEN,amdMemObjsNumThreadTrace,calTthreadTraceConfig);
|
||||
}
|
||||
else if (cmd.getState() == amd::ThreadTraceCommand::End) {
|
||||
endThreadTrace(gslThreadTrace,2);
|
||||
for (uint32_t idx = 0; idx < seNum; ++idx) {
|
||||
rs()->enableShaderTrace(cs(), idx, false);
|
||||
}
|
||||
gslThreadTrace->EndQuery(cs(), 0);
|
||||
}
|
||||
else if (cmd.getState() == amd::ThreadTraceCommand::Pause) {
|
||||
pauseThreadTrace(2);
|
||||
for (uint32_t idx = 0; idx < seNum; ++idx) {
|
||||
rs()->setShaderTraceIsPaused(cs(), idx, true);
|
||||
}
|
||||
}
|
||||
else if (cmd.getState() == amd::ThreadTraceCommand::Resume) {
|
||||
resumeThreadTrace(2);
|
||||
for (uint32_t idx = 0; idx < seNum; ++idx) {
|
||||
rs()->setShaderTraceIsPaused(cs(), idx, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -2584,20 +2597,32 @@ VirtualGPU::submitReleaseExtObjects(amd::ReleaseExtObjectsCommand& vcmd)
|
||||
void
|
||||
VirtualGPU::submitSignal(amd::SignalCommand & vcmd)
|
||||
{
|
||||
bool res = true;
|
||||
amd::ScopedLock lock(execution());
|
||||
profilingBegin(vcmd);
|
||||
gpu::Memory* gpuMemory = dev().getGpuMemory(&vcmd.memory());
|
||||
if (vcmd.type() == CL_COMMAND_WAIT_SIGNAL_AMD) {
|
||||
res = WaitSignal(gpuMemory->gslResource(), vcmd.markerValue());
|
||||
}
|
||||
else if (vcmd.type() == CL_COMMAND_WRITE_SIGNAL_AMD) {
|
||||
res = WriteSignal(gpuMemory->gslResource(), vcmd.markerValue(),
|
||||
vcmd.markerOffset());
|
||||
}
|
||||
if(res != true) {
|
||||
uint64_t surfAddr = gpuMemory->gslResource()->getPhysicalAddress(cs());
|
||||
uint64_t markerAddr = gpuMemory->gslResource()->getMarkerAddress(cs());
|
||||
uint64_t markerOffset = markerAddr - surfAddr;
|
||||
/* @todo this logic doesn't make any sense
|
||||
if((markerAddr + markerOffset) == 0) {
|
||||
LogError("submitSignal failed");
|
||||
vcmd.setStatus(CL_INVALID_OPERATION);
|
||||
}
|
||||
*/
|
||||
cs()->p2pMarkerOp(gpuMemory->gslResource(), vcmd.markerValue(),
|
||||
markerOffset, false);
|
||||
}
|
||||
else if (vcmd.type() == CL_COMMAND_WRITE_SIGNAL_AMD) {
|
||||
GpuEvent gpuEvent;
|
||||
eventBegin(MainEngine);
|
||||
cs()->p2pMarkerOp(gpuMemory->gslResource(), vcmd.markerValue(), vcmd.markerOffset(), true);
|
||||
//! @todo We don't need flush if an event is tracked.
|
||||
cs()->Flush();
|
||||
eventEnd(MainEngine, gpuEvent);
|
||||
gpuMemory->setBusy(*this, gpuEvent);
|
||||
// Update the global GPU event
|
||||
setGpuEvent(gpuEvent);
|
||||
}
|
||||
profilingEnd(vcmd);
|
||||
}
|
||||
@@ -2618,14 +2643,11 @@ VirtualGPU::submitMakeBuffersResident(amd::MakeBuffersResidentCommand & vcmd)
|
||||
gpuMemory->syncCacheFromHost(*this);
|
||||
}
|
||||
|
||||
cl_ulong* surfBusAddr = new cl_ulong[numObjects];
|
||||
cl_ulong* markerBusAddr = new cl_ulong[numObjects];
|
||||
bool res = MakeBuffersResident(
|
||||
numObjects,
|
||||
pGSLMemObjects,
|
||||
(CALuint64*)surfBusAddr,
|
||||
(CALuint64*)markerBusAddr);
|
||||
if(res != true) {
|
||||
uint64* surfBusAddr = new uint64[numObjects];
|
||||
uint64* markerBusAddr = new uint64[numObjects];
|
||||
gslErrorCode res = cs()->makeBuffersResident(numObjects, pGSLMemObjects,
|
||||
surfBusAddr, markerBusAddr);
|
||||
if(res != GSL_NO_ERROR) {
|
||||
LogError("MakeBuffersResident failed");
|
||||
vcmd.setStatus(CL_INVALID_OPERATION);
|
||||
}
|
||||
@@ -2972,11 +2994,11 @@ VirtualGPU::setActiveKernelDesc(
|
||||
|
||||
if (result) {
|
||||
// Set program in GSL
|
||||
setProgram(desc->func_);
|
||||
rs()->setCurrentProgramObject(GSL_COMPUTE_PROGRAM, desc->func_);
|
||||
|
||||
// Update internal constant buffer
|
||||
if (desc->intCb_ != 0) {
|
||||
setConstants(desc->intCb_);
|
||||
cs()->setIntConstants(GSL_COMPUTE_PROGRAM, desc->intCb_);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3045,11 +3067,6 @@ VirtualGPU::allocKernelDesc(const Kernel* kernel, CALimage calImage)
|
||||
delete desc;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// prime the func info in the func object.
|
||||
//
|
||||
getFuncInfo(desc->func_, GSL_COMPUTE_PROGRAM, &desc->funcInfo_);
|
||||
}
|
||||
|
||||
if (kernel->argSize() > slots_.size()) {
|
||||
@@ -3066,7 +3083,7 @@ VirtualGPU::freeKernelDesc(VirtualGPU::GslKernelDesc* desc)
|
||||
if (gslKernelDesc() == desc) {
|
||||
// Clear active kernel desc
|
||||
activeKernelDesc_ = NULL;
|
||||
setProgram(0);
|
||||
rs()->setCurrentProgramObject(GSL_COMPUTE_PROGRAM, 0);
|
||||
}
|
||||
|
||||
if (desc->image_ != 0) {
|
||||
@@ -3076,9 +3093,10 @@ VirtualGPU::freeKernelDesc(VirtualGPU::GslKernelDesc* desc)
|
||||
|
||||
if (desc->func_ != 0) {
|
||||
if (desc->intCb_ != 0) {
|
||||
destroyConstants(desc->intCb_);
|
||||
cs()->setIntConstants(GSL_COMPUTE_PROGRAM, 0);
|
||||
cs()->destroyMemObject(desc->intCb_);
|
||||
}
|
||||
destroyProgramObject(desc->func_);
|
||||
cs()->destroyProgramObject(desc->func_);
|
||||
}
|
||||
|
||||
delete desc;
|
||||
|
||||
@@ -96,7 +96,6 @@ public:
|
||||
gslProgramObject func_; //!< GSL program object
|
||||
gslMemObject intCb_; //!< Internal constant buffer
|
||||
CALUavMask uavMask_; //!< UAV mask, unclear if necessary
|
||||
CALfuncInfo funcInfo_; //!< CAL function info
|
||||
};
|
||||
|
||||
struct ResourceSlot
|
||||
|
||||
@@ -388,29 +388,6 @@ CALGSLContext::setUAVChannelOrder(uint32 physUnit, gslMemObject mem)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::setProgram(gslProgramObject func)
|
||||
{
|
||||
m_rs->setCurrentProgramObject(GSL_COMPUTE_PROGRAM, func);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::setWavesPerSH(gslProgramObject func, uint32 wavesPerSH)const
|
||||
{
|
||||
auto compProg = static_cast<gsl::ComputeProgramObject*>(func);
|
||||
compProg->setWavesPerSH(wavesPerSH);
|
||||
}
|
||||
|
||||
bool
|
||||
CALGSLContext::runProgramGrid(GpuEvent& event, const ProgramGrid* pProgramGrid, const gslMemObject* mems, uint32 numMems)
|
||||
{
|
||||
eventBegin(MainEngine);
|
||||
m_rs->Dispatch(m_cs, &pProgramGrid->gridBlock, &pProgramGrid->partialGridBlock,
|
||||
&pProgramGrid->gridSize, pProgramGrid->localSize, mems, numMems);
|
||||
eventEnd(MainEngine, event);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
CALGSLContext::isDone(GpuEvent* event)
|
||||
{
|
||||
@@ -438,24 +415,12 @@ CALGSLContext::waitForEvent(GpuEvent* event)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::flushIOCaches() const
|
||||
{
|
||||
m_cs->FlushIOCaches();
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::flushCUCaches(bool flushL2) const
|
||||
{
|
||||
m_cs->FlushCUCaches(flushL2);
|
||||
}
|
||||
|
||||
gslProgramObject
|
||||
CALGSLContext::createProgramObject(CALuint type)
|
||||
{
|
||||
return m_cs->createProgramObject(GSL_COMPUTE_PROGRAM);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::setScratchBuffer(gslMemObject mem, int32 engineId)
|
||||
{
|
||||
@@ -472,20 +437,6 @@ CALGSLContext::setScratchBuffer(gslMemObject mem, int32 engineId)
|
||||
m_scratchBuffers->setMemObject(m_cs, mem, engineId);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::destroyProgramObject(gslProgramObject func)
|
||||
{
|
||||
m_cs->destroyProgramObject(func);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::writeSurfRaw(GpuEvent& event, gslMemObject mem, size_t size, const void* data)
|
||||
{
|
||||
eventBegin(MainEngine);
|
||||
mem->writeDataRaw(m_cs, size, data, true);
|
||||
eventEnd(MainEngine, event);
|
||||
}
|
||||
|
||||
bool
|
||||
CALGSLContext::copyPartial(GpuEvent& event,
|
||||
gslMemObject srcMem,
|
||||
@@ -631,169 +582,6 @@ CALGSLContext::setSamplerParameter(uint32 sampler, gslTexParameterPname param, v
|
||||
}
|
||||
}
|
||||
|
||||
gslQueryObject CALGSLContext::createCounter(gslQueryTarget target) const
|
||||
{
|
||||
return m_cs->createQuery(target);
|
||||
}
|
||||
|
||||
void CALGSLContext::destroyCounter(gslQueryObject counter) const
|
||||
{
|
||||
m_cs->destroyQuery(counter);
|
||||
}
|
||||
|
||||
void CALGSLContext::beginCounter(gslQueryObject counter, gslQueryTarget target) const
|
||||
{
|
||||
// This should never be called for UVD/VCE Sync queries in case it is
|
||||
// Please correctly pass on EngineMask else queries may be messed up
|
||||
assert(target != GSL_UVD_SYNC_ATI || target != GSL_VCE_SYNC_ATI);
|
||||
counter->BeginQuery(m_cs, target, 0);
|
||||
}
|
||||
|
||||
void CALGSLContext::endCounter(gslQueryObject counter, GpuEvent& event)
|
||||
{
|
||||
eventBegin(MainEngine);
|
||||
counter->EndQuery(m_cs, 0);
|
||||
eventEnd(MainEngine, event);
|
||||
}
|
||||
|
||||
void CALGSLContext::getCounter(uint64* result, gslQueryObject counter) const
|
||||
{
|
||||
counter->GetResult(m_cs, result);
|
||||
}
|
||||
|
||||
void CALGSLContext::configPerformanceCounter(gslQueryObject counter, CALuint block, CALuint index, CALuint event) const
|
||||
{
|
||||
counter->getAsPerformanceQueryObject()->setCounterState(block, index, event);
|
||||
}
|
||||
|
||||
gslMemObject
|
||||
CALGSLContext::createConstants(uint32 count) const
|
||||
{
|
||||
assert(m_cs != 0);
|
||||
|
||||
const gslMemObjectAttribs attribs(
|
||||
GSL_MOA_CONSTANT_STORE, // type
|
||||
GSL_MOA_MEMORY_CARD, // location
|
||||
GSL_MOA_TILING_LINEAR, // tiling
|
||||
GSL_MOA_DISPLAYABLE_NO, // displayable
|
||||
ATIGL_FALSE, // mipmap
|
||||
1, // samples
|
||||
0, // cpu_address
|
||||
GSL_MOA_SIGNED_NO, // signed_format
|
||||
GSL_MOA_FORMAT_NORM, // numFormat
|
||||
DRIVER_MODULE_GLL, // module
|
||||
GSL_ALLOCATION_INSTANCED // alloc_type
|
||||
);
|
||||
|
||||
return m_cs->createMemObject1D(CM_SURF_FMT_RGBX8, count, &attribs);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::setConstants(gslMemObject constants) const
|
||||
{
|
||||
m_cs->setIntConstants(GSL_COMPUTE_PROGRAM, constants);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::destroyConstants(gslMemObject constants) const
|
||||
{
|
||||
assert(m_cs != 0);
|
||||
assert(constants != 0);
|
||||
|
||||
m_cs->setIntConstants(GSL_COMPUTE_PROGRAM, 0);
|
||||
m_cs->destroyMemObject(constants);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::getFuncInfo(gslProgramObject func, gslProgramTarget target, CALfuncInfo *pInfo)
|
||||
{
|
||||
assert(m_cs!= 0);
|
||||
assert(func!= 0);
|
||||
|
||||
gsl::gsProgramInfo* pProgramResource = func->getProgramResourceInfo();
|
||||
|
||||
pInfo->maxScratchRegsNeeded = pProgramResource->elfInfo._maxScratchRegsNeeded;
|
||||
pInfo->numSharedGPRUser = pProgramResource->elfInfo._numSharedGPRUser;
|
||||
pInfo->numSharedGPRTotal = pProgramResource->elfInfo._numSharedGPRTotal;
|
||||
pInfo->eCsSetupMode = (CALboolean)pProgramResource->elfInfo._eCsSetupMode;
|
||||
pInfo->numThreadPerGroup = pProgramResource->elfInfo._numThreadPerGroup;
|
||||
pInfo->numThreadPerGroupX = pProgramResource->elfInfo._numThreadPerGroupX;
|
||||
pInfo->numThreadPerGroupY = pProgramResource->elfInfo._numThreadPerGroupY;
|
||||
pInfo->numThreadPerGroupZ = pProgramResource->elfInfo._numThreadPerGroupZ;
|
||||
pInfo->totalNumThreadGroup = pProgramResource->elfInfo._totalNumThreadGroup;
|
||||
pInfo->numWavefrontPerSIMD = pProgramResource->elfInfo._NumWavefrontPerSIMD;
|
||||
pInfo->isMaxNumWavePerSIMD = (CALboolean)pProgramResource->elfInfo._IsMaxNumWavePerSIMD;
|
||||
pInfo->setBufferForNumGroup = (CALboolean)pProgramResource->elfInfo._SetBufferForNumGroup;
|
||||
pInfo->wavefrontSize = pProgramResource->wavefrontSize;
|
||||
pInfo->numGPRsAvailable = pProgramResource->numGPRsAvailable;
|
||||
pInfo->numGPRsUsed = pProgramResource->numGPRsUsed;
|
||||
pInfo->numSGPRsAvailable = pProgramResource->numSGPRsAvailable;
|
||||
pInfo->numSGPRsUsed = pProgramResource->numSGPRsUsed;
|
||||
pInfo->numVGPRsAvailable = pProgramResource->numVGPRsAvailable;
|
||||
pInfo->numVGPRsUsed = pProgramResource->numVGPRsUsed;
|
||||
pInfo->LDSSizeAvailable = pProgramResource->LDSSizeAvailable;
|
||||
pInfo->LDSSizeUsed = pProgramResource->LDSSizeUsed;
|
||||
pInfo->stackSizeAvailable = pProgramResource->stackSizeAvailable;
|
||||
pInfo->stackSizeUsed = pProgramResource->stackSizeUsed;
|
||||
}
|
||||
|
||||
bool
|
||||
CALGSLContext::WaitSignal(gslMemObject mem, CALuint value)
|
||||
{
|
||||
uint64 surfAddr = mem->getPhysicalAddress(m_cs);
|
||||
uint64 markerAddr = mem->getMarkerAddress(m_cs);
|
||||
|
||||
uint64 markerOffset = markerAddr - surfAddr;
|
||||
|
||||
if((markerAddr + markerOffset) == 0)
|
||||
return false;
|
||||
|
||||
|
||||
m_cs->p2pMarkerOp(mem, value, markerOffset, false);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
CALGSLContext::WriteSignal(gslMemObject mem, CALuint value, CALuint64 offset)
|
||||
{
|
||||
m_cs->p2pMarkerOp(mem, value,offset, true);
|
||||
m_cs->Flush();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
CALGSLContext::MakeBuffersResident(CALuint numObjects, gslMemObject* pMemObjects,
|
||||
CALuint64* surfBusAddress, CALuint64* markerBusAddress)
|
||||
{
|
||||
bool res = true;
|
||||
|
||||
res = (m_cs->makeBuffersResident(numObjects, pMemObjects, surfBusAddress,
|
||||
markerBusAddress) == GSL_NO_ERROR) ? true:false;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::bindAtomicCounter(uint32 index, gslMemObject obj)
|
||||
{
|
||||
m_cs->bindAtomicCounter(index, obj);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::setGWSResource(uint32 index, uint32 value)
|
||||
{
|
||||
m_cs->setGWSResource(index, value);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::syncAtomicCounter(GpuEvent& event, uint32 index, bool read)
|
||||
{
|
||||
eventBegin(MainEngine);
|
||||
m_cs->syncAtomicCounter(index, read);
|
||||
eventEnd(MainEngine, event);
|
||||
}
|
||||
|
||||
bool
|
||||
CALGSLContext::moduleLoad(CALimage image,
|
||||
gslProgramObject* func, gslMemObject* constants, CALUavMask* uavMask)
|
||||
@@ -824,7 +612,7 @@ CALGSLContext::moduleLoad(CALimage image,
|
||||
return false;
|
||||
}
|
||||
|
||||
*func = createProgramObject((CALuint)ED_ATI_CAL_TYPE_COMPUTE);
|
||||
*func = m_cs->createProgramObject(GSL_COMPUTE_PROGRAM);
|
||||
if (*func == 0)
|
||||
{
|
||||
amuABIMultiBinaryDestroy(binary);
|
||||
@@ -852,7 +640,21 @@ CALGSLContext::moduleLoad(CALimage image,
|
||||
|
||||
if (numConstants > 0)
|
||||
{
|
||||
*constants = createConstants(++maxPhysical);
|
||||
const gslMemObjectAttribs attribs(
|
||||
GSL_MOA_CONSTANT_STORE, // type
|
||||
GSL_MOA_MEMORY_CARD, // location
|
||||
GSL_MOA_TILING_LINEAR, // tiling
|
||||
GSL_MOA_DISPLAYABLE_NO, // displayable
|
||||
ATIGL_FALSE, // mipmap
|
||||
1, // samples
|
||||
0, // cpu_address
|
||||
GSL_MOA_SIGNED_NO, // signed_format
|
||||
GSL_MOA_FORMAT_NORM, // numFormat
|
||||
DRIVER_MODULE_GLL, // module
|
||||
GSL_ALLOCATION_INSTANCED // alloc_type
|
||||
);
|
||||
|
||||
*constants = m_cs->createMemObject1D(CM_SURF_FMT_RGBX8, ++maxPhysical, &attribs);
|
||||
|
||||
CALuint* ptr = static_cast<CALuint*>((*constants)->map(m_cs, GSL_MAP_READ_WRITE));
|
||||
assert(ptr != 0 && "gslMapMemImage failed!");
|
||||
@@ -874,136 +676,6 @@ CALGSLContext::moduleLoad(CALimage image,
|
||||
return true;
|
||||
}
|
||||
|
||||
gslQueryObject CALGSLContext::createThreadTrace(void) const
|
||||
{
|
||||
return m_cs->createQuery(GSL_SHADER_TRACE_BYTES_WRITTEN);
|
||||
}
|
||||
|
||||
void CALGSLContext::destroyThreadTrace(gslQueryObject threadTrace) const
|
||||
{
|
||||
m_cs->destroyQuery(threadTrace);
|
||||
}
|
||||
|
||||
|
||||
gslShaderTraceBufferObject
|
||||
CALGSLContext::CreateThreadTraceBuffer(void) const
|
||||
{
|
||||
return m_cs->createShaderTraceBuffer();
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::DestroyThreadTraceBuffer(gslShaderTraceBufferObject shaderTraceBuffer,uint32 index) const
|
||||
{
|
||||
shaderTraceBuffer->attachMemObject(m_cs, NULL, 0, 0, 0, index);
|
||||
m_cs->destroyShaderTraceBuffer(shaderTraceBuffer);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::configMemThreadTrace(gslShaderTraceBufferObject shaderTraceBuffer,gslMemObject memObject,uint32 index,uint32 size) const
|
||||
{
|
||||
shaderTraceBuffer->attachMemObject(m_cs, memObject, 0, 0, size,index);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::beginThreadTrace(gslQueryObject threadTrace,gslQueryObject threadTrace2, gslQueryTarget target,uint32 seNum,CALthreadTraceConfig& threadTraceConfig) const
|
||||
{
|
||||
// This should never be called for UVD/VCE Sync queries in case it is
|
||||
// Please correctly pass on EngineMask else queries may be messed up
|
||||
assert(target != GSL_UVD_SYNC_ATI || target != GSL_VCE_SYNC_ATI);
|
||||
const gslErrorCode ec = threadTrace->BeginQuery(m_cs, target, 0);
|
||||
assert(ec == GSL_NO_ERROR);
|
||||
|
||||
for (uint32 index = 0;index < seNum;++index) {
|
||||
m_rs->enableShaderTrace(m_cs,index,true);
|
||||
m_rs->setShaderTraceComputeUnit(index,threadTraceConfig.cu);
|
||||
m_rs->setShaderTraceShaderArray(index,threadTraceConfig.sh);
|
||||
m_rs->setShaderTraceSIMDMask(index,threadTraceConfig.simd_mask);
|
||||
m_rs->setShaderTraceVmIdMask(index,threadTraceConfig.vm_id_mask);
|
||||
m_rs->setShaderTraceTokenMask(index,threadTraceConfig.token_mask);
|
||||
m_rs->setShaderTraceRegisterMask(index,threadTraceConfig.reg_mask);
|
||||
m_rs->setShaderTraceIssueMask(index,threadTraceConfig.inst_mask);
|
||||
m_rs->setShaderTraceRandomSeed(index,threadTraceConfig.random_seed);
|
||||
if (threadTraceConfig.is_user_data) {
|
||||
m_rs->setShaderTraceUserData(index,threadTraceConfig.user_data);
|
||||
}
|
||||
m_rs->setShaderTraceCaptureMode(index,threadTraceConfig.capture_mode);
|
||||
if (threadTraceConfig.is_wrapped) {
|
||||
m_rs->setShaderTraceWrap(index,true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::endThreadTrace(gslQueryObject threadTrace,uint32 seNum) const
|
||||
{
|
||||
for (uint32 index = 0;index < seNum;++index) {
|
||||
m_rs->enableShaderTrace(m_cs,index,false);
|
||||
}
|
||||
threadTrace->EndQuery(m_cs, 0);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::pauseThreadTrace(uint32 seNum) const
|
||||
{
|
||||
for (uint32 index = 0;index < seNum;++index) {
|
||||
m_rs->setShaderTraceIsPaused(m_cs,index,(bool32)true);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::resumeThreadTrace(uint32 seNum) const
|
||||
{
|
||||
for (uint32 index = 0;index < seNum;++index) {
|
||||
m_rs->setShaderTraceIsPaused(m_cs,index,(bool32)false);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::getThreadTraceQueryRes(gslQueryObject threadTrace, uint32* info) const
|
||||
{
|
||||
threadTrace->GetResultAll(m_cs, info);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::writeTimer(bool sdma, const gslMemObject mem, uint32 offset) const
|
||||
{
|
||||
m_rs->writeTimer(m_cs, sdma, mem, offset);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::runAqlDispatch(GpuEvent& event, const void* aqlPacket,
|
||||
const gslMemObject* mems, uint32 numMems, gslMemObject scratch, uint32 scratchOffset,
|
||||
const void* cpuKernelCode, uint64 hsaQueueVA, const void* kernelInfo)
|
||||
{
|
||||
eventBegin(MainEngine);
|
||||
m_cs->AqlDispatch(aqlPacket, mems, numMems, scratch, scratchOffset, cpuKernelCode, hsaQueueVA, kernelInfo);
|
||||
eventEnd(MainEngine, event);
|
||||
}
|
||||
|
||||
mcaddr
|
||||
CALGSLContext::virtualQueueDispatcherStart()
|
||||
{
|
||||
return m_cs->VirtualQueueDispatcherStart();
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::virtualQueueDispatcherEnd(GpuEvent& event, const gslMemObject* mems,
|
||||
uint32 numMems, mcaddr signal, mcaddr loopStart, uint32 numTemplates)
|
||||
{
|
||||
eventBegin(MainEngine);
|
||||
m_cs->VirtualQueueDispatcherEnd(mems, numMems, signal, loopStart, numTemplates);
|
||||
eventEnd(MainEngine, event);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::virtualQueueHandshake(GpuEvent& event, const gslMemObject mem, mcaddr parentState,
|
||||
uint32 newStateValue, mcaddr parentChildCounter, mcaddr signal, bool dedicatedQueue)
|
||||
{
|
||||
eventBegin(MainEngine);
|
||||
m_cs->VirtualQueueHandshake(mem, parentState, newStateValue, parentChildCounter, signal, dedicatedQueue);
|
||||
eventEnd(MainEngine, event);
|
||||
}
|
||||
|
||||
void
|
||||
CALGSLContext::InvalidateSqCaches(bool instInvalidate, bool dataInvalidate, bool tcL1, bool tcL2)
|
||||
{
|
||||
|
||||
@@ -39,20 +39,8 @@ public:
|
||||
bool setUAVBuffer(uint32 physUnit, gslMemObject mem, gslUAVType uavType);
|
||||
void setUavMask(const CALUavMask& uavMask);
|
||||
void setUAVChannelOrder(uint32 physUnit, gslMemObject mem);
|
||||
void setProgram(gslProgramObject func);
|
||||
void setWavesPerSH(gslProgramObject func, uint32 wavesPerSH)const;
|
||||
bool runProgramGrid(GpuEvent& event, const ProgramGrid* pProgramGrid, const gslMemObject* mems, uint32 numMems);
|
||||
void runAqlDispatch(GpuEvent& event, const void* aqlPacket, const gslMemObject* mems,
|
||||
uint32 numMems, gslMemObject scratch, uint32 scratchOffset, const void* cpuKernelCode,
|
||||
uint64 hsaQueueVA, const void* kernelInfo);
|
||||
mcaddr virtualQueueDispatcherStart();
|
||||
void virtualQueueDispatcherEnd(GpuEvent& event, const gslMemObject* mems, uint32 numMems,
|
||||
mcaddr signal, mcaddr loopStart, uint32 numTemplates);
|
||||
void virtualQueueHandshake(GpuEvent& event, const gslMemObject mem, mcaddr parentState,
|
||||
uint32 newStateValue, mcaddr parentChildCounter, mcaddr signal, bool dedicatedQueue);
|
||||
bool isDone(GpuEvent* event);
|
||||
void waitForEvent(GpuEvent* event);
|
||||
void flushIOCaches() const;
|
||||
void flushCUCaches(bool flushL2 = false) const;
|
||||
void eventBegin(EngineType engId)
|
||||
{
|
||||
@@ -68,53 +56,18 @@ public:
|
||||
event.engineId_ = engId;
|
||||
}
|
||||
|
||||
gslProgramObject createProgramObject(uint32 type);
|
||||
void destroyProgramObject(gslProgramObject func);
|
||||
|
||||
bool copyPartial(GpuEvent& event, gslMemObject srcMem, size_t* srcOffset,
|
||||
gslMemObject destMem, size_t* destOffset, size_t* size, CALmemcopyflags flags, bool enableCopyRect, uint32 bytesPerElement);
|
||||
|
||||
void setSamplerParameter(uint32 sampler, gslTexParameterPname param, CALvoid* vals);
|
||||
|
||||
gslQueryObject createCounter(gslQueryTarget target) const;
|
||||
void configPerformanceCounter(gslQueryObject counter, CALuint block, CALuint index, CALuint event) const;
|
||||
void destroyCounter(gslQueryObject counter) const;
|
||||
void beginCounter(gslQueryObject counter, gslQueryTarget target) const;
|
||||
void endCounter(gslQueryObject counter, GpuEvent& event);
|
||||
void getCounter(uint64* result, gslQueryObject counter) const;
|
||||
|
||||
gslMemObject createConstants(uint32 count) const;
|
||||
void setConstants(gslMemObject constants) const;
|
||||
void destroyConstants(gslMemObject constants) const;
|
||||
|
||||
bool recompileShader(CALimage srcImage, CALimage* newImage, const CALuint type);
|
||||
bool getMachineType(CALuint* pMachine, CALuint* pType, CALimage image);
|
||||
|
||||
void getFuncInfo(gslProgramObject func, gslProgramTarget target, CALfuncInfo* pInfo);
|
||||
|
||||
void bindAtomicCounter(uint32 index, gslMemObject obj);
|
||||
void syncAtomicCounter(GpuEvent& event, uint32 index, bool read);
|
||||
|
||||
void setGWSResource(uint32 index, uint32 value);
|
||||
|
||||
void ReleaseOutputResource(CALuint taskID, CALuint flags);
|
||||
bool moduleLoad(CALimage image, gslProgramObject* func, gslMemObject* constants, CALUavMask* uavMask);
|
||||
bool WaitSignal(gslMemObject mem, CALuint value);
|
||||
bool WriteSignal(gslMemObject mem, CALuint value, CALuint64 offset);
|
||||
bool MakeBuffersResident(CALuint numObjects, gslMemObject* pMemObjects, CALuint64* surfBusAddress, CALuint64* markerBusAddress);
|
||||
|
||||
gslQueryObject createThreadTrace(void) const;
|
||||
void destroyThreadTrace(gslQueryObject) const;
|
||||
gslShaderTraceBufferObject CreateThreadTraceBuffer(void) const;
|
||||
void DestroyThreadTraceBuffer(gslShaderTraceBufferObject,uint32) const;
|
||||
void getThreadTraceQueryRes(gslQueryObject, uint32* info) const;
|
||||
void configMemThreadTrace(gslShaderTraceBufferObject,gslMemObject,uint32,uint32) const;
|
||||
void beginThreadTrace(gslQueryObject,gslQueryObject, gslQueryTarget,uint32,CALthreadTraceConfig&) const;
|
||||
void endThreadTrace(gslQueryObject,uint32) const;
|
||||
void pauseThreadTrace(uint32) const;
|
||||
void resumeThreadTrace(uint32) const;
|
||||
void writeTimer(bool sdma, const gslMemObject mem, uint32 offset) const;
|
||||
void writeSurfRaw(GpuEvent& event, gslMemObject mem, size_t size, const void* data);
|
||||
gsl::gsCtx* cs() const { return m_cs; }
|
||||
gslRenderState rs() const { return m_rs; }
|
||||
|
||||
/// HW Debug support functions
|
||||
void InvalidateSqCaches(bool instInvalidate = true, bool dataInvalidate = true, bool tcL1 = true, bool tcL2 = true);
|
||||
@@ -142,7 +95,6 @@ private:
|
||||
|
||||
gsl::gsCtx* m_cs;
|
||||
gslRenderState m_rs;
|
||||
|
||||
gslConstantBufferObject m_constantBuffers[MAX_CONSTANTBUFFERS];
|
||||
gslUAVObject m_uavResources[MAX_UAVS];
|
||||
gslTextureResourceObject m_textureResources[MAX_RESOURCES];
|
||||
|
||||
@@ -191,28 +191,6 @@ typedef enum CALresallocsliceviewflagsRec {
|
||||
CAL_RESALLOCSLICEVIEW_LEVEL_AND_LAYER = CAL_RESALLOCSLICEVIEW_LEVEL | CAL_RESALLOCSLICEVIEW_LAYER,
|
||||
} CALresallocsliceviewflags;
|
||||
|
||||
//
|
||||
// Thread Trace Extension
|
||||
//
|
||||
|
||||
typedef struct CALthreadTraceConfigRec CALthreadTraceConfig;
|
||||
|
||||
struct CALthreadTraceConfigRec
|
||||
{
|
||||
CALuint cu; // target compute unit [cu]
|
||||
CALuint sh; // target shader array [sh],that contains target cu
|
||||
CALuint simd_mask; // bitmask to enable or disable target tokens for different SIMDs
|
||||
CALuint vm_id_mask; // virtual memory [vm] IDs to capture
|
||||
CALuint token_mask; // bitmask indicating which trace token IDs will be included in the trace
|
||||
CALuint reg_mask; // bitmask indicating which register types should be included in the trace
|
||||
CALuint inst_mask; // types of instruction scheduling updates which should be recorded
|
||||
CALuint random_seed; // linear feedback shift register [LFSR] seed
|
||||
CALuint user_data; // user data ,which is written as payload
|
||||
CALuint capture_mode; // indicator for the way how THREAD_TRACE_START / STOP events affect token collection
|
||||
CALboolean is_user_data; // indicator if user_data is set
|
||||
CALboolean is_wrapped; // indicator if the memory buffer should be wrapped around instead of stopping at the end
|
||||
};
|
||||
|
||||
typedef enum CALmemcopyflagsEnum
|
||||
{
|
||||
CAL_MEMCOPY_DEFAULT = 0, /**< default CAL behavior of partial sync */
|
||||
|
||||
Odkázat v novém úkolu
Zablokovat Uživatele