blob: 9f507a9c61fb00610a115ea12addba95da8945d6 [file] [log] [blame]
//
// Copyright 2025 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// trace_fixture_cl.cpp:
// OpenCL-specific code for the ANGLE trace replays.
//
#include "trace_fixture_cl.h"
#include <string>
namespace
{
angle::TraceCallbacks *gTraceCallbacks = nullptr;
}
cl_platform_id *clPlatformsMap;
cl_device_id *clDevicesMap;
cl_context *clContextsMap;
cl_command_queue *clCommandQueuesMap;
cl_mem *clMemMap;
cl_event *clEventsMap;
cl_program *clProgramsMap;
cl_kernel *clKernelsMap;
cl_sampler *clSamplerMap;
void **clVoidMap;
std::vector<cl_platform_id> temporaryPlatformsList;
std::vector<cl_device_id> temporaryDevicesList;
std::vector<cl_kernel> temporaryKernelsList;
std::vector<cl_mem> temporaryBuffersList;
std::vector<cl_program> temporaryProgramsList;
std::vector<cl_event> temporaryEventsList;
cl_image_desc temporaryImageDesc;
std::vector<cl_context_properties> temporaryContextProps;
std::vector<const char *> temporaryCharPointerList;
std::vector<const void *> temporaryVoidPtrList;
std::vector<const unsigned char *> temporaryUnsignedCharPointerList;
void *temporaryVoidPtr;
angle::ReplayResourceMode gReplayResourceMode = angle::ReplayResourceMode::Active;
uint8_t *gBinaryData;
uint8_t *gReadBuffer;
std::string gBinaryDataDir = ".";
template <typename T>
T *AllocateZeroedValues(size_t count)
{
T *mem = new T[count + 1];
memset(mem, 0, sizeof(T) * (count + 1));
return mem;
}
GLuint *AllocateZeroedUints(size_t count)
{
return AllocateZeroedValues<GLuint>(count);
}
void InitializeReplayCL(const char *binaryDataFileName,
size_t maxClientArraySize,
size_t readBufferSize,
uint32_t maxCLPlatform,
uint32_t maxCLDevices,
uint32_t maxCLContexts,
uint32_t maxCLCommandQueues,
uint32_t maxCLMem,
uint32_t maxCLEvents,
uint32_t maxCLPrograms,
uint32_t maxCLKernels,
uint32_t maxCLSamplers,
uint32_t maxCLVoidPointer)
{
gBinaryData = gTraceCallbacks->LoadBinaryData(binaryDataFileName);
gReadBuffer = new uint8_t[readBufferSize];
clPlatformsMap = AllocateZeroedValues<cl_platform_id>(maxCLPlatform);
clDevicesMap = AllocateZeroedValues<cl_device_id>(maxCLDevices);
clContextsMap = AllocateZeroedValues<cl_context>(maxCLContexts);
clCommandQueuesMap = AllocateZeroedValues<cl_command_queue>(maxCLCommandQueues);
clMemMap = AllocateZeroedValues<cl_mem>(maxCLMem);
clEventsMap = AllocateZeroedValues<cl_event>(maxCLEvents);
clProgramsMap = AllocateZeroedValues<cl_program>(maxCLPrograms);
clKernelsMap = AllocateZeroedValues<cl_kernel>(maxCLKernels);
clSamplerMap = AllocateZeroedValues<cl_sampler>(maxCLSamplers);
clVoidMap = AllocateZeroedValues<void *>(maxCLVoidPointer);
}
void FinishReplay()
{
delete[] gReadBuffer;
delete[] clPlatformsMap;
delete[] clDevicesMap;
delete[] clContextsMap;
delete[] clCommandQueuesMap;
delete[] clMemMap;
delete[] clEventsMap;
delete[] clProgramsMap;
delete[] clKernelsMap;
delete[] clSamplerMap;
delete[] clVoidMap;
}
angle::TraceInfo gTraceInfo;
std::string gTraceGzPath;
struct TraceFunctionsImplCL : angle::TraceFunctions
{
void SetupReplay() override { ::SetupReplay(); }
void ReplayFrame(uint32_t frameIndex) override { ::ReplayFrame(frameIndex); }
void ResetReplay() override { ::ResetReplay(); }
void SetupFirstFrame() override { ::SetupFirstFrame(); }
void FinishReplay() override { ::FinishReplay(); }
void SetBinaryDataDir(const char *dataDir) override { gBinaryDataDir = dataDir; }
void SetReplayResourceMode(const angle::ReplayResourceMode resourceMode) override
{
gReplayResourceMode = resourceMode;
}
void SetTraceInfo(const angle::TraceInfo &traceInfo) override { gTraceInfo = traceInfo; }
void SetTraceGzPath(const std::string &traceGzPath) override { gTraceGzPath = traceGzPath; }
};
TraceFunctionsImplCL gTraceFunctionsImpl;
void SetupEntryPoints(angle::TraceCallbacks *traceCallbacks, angle::TraceFunctions **traceFunctions)
{
gTraceCallbacks = traceCallbacks;
*traceFunctions = &gTraceFunctionsImpl;
}
void UpdateCLContextPropertiesNoPlatform(size_t propSize, const cl_context_properties *propData)
{
temporaryContextProps.resize(propSize);
std::memcpy(temporaryContextProps.data(), propData, propSize);
}
void UpdateCLContextPropertiesWithPlatform(size_t propSize,
const cl_context_properties *propData,
size_t platformIdxInProps,
size_t platformIdxInMap)
{
UpdateCLContextPropertiesNoPlatform(propSize, propData);
std::memcpy(&temporaryContextProps.data()[platformIdxInProps],
&clPlatformsMap[platformIdxInMap], sizeof(cl_platform_id));
}