mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-25 13:33:02 +08:00
Enable transforming image 3d to image 2d array
Change-Id: I8fdc6899780481bdebeaf858a330e9dea822bda3
This commit is contained in:
@@ -41,6 +41,7 @@
|
||||
#include "runtime/mem_obj/buffer.h"
|
||||
#include "runtime/mem_obj/image.h"
|
||||
#include "runtime/mem_obj/pipe.h"
|
||||
#include "runtime/kernel/image_transformer.h"
|
||||
#include "runtime/memory_manager/memory_manager.h"
|
||||
#include "runtime/memory_manager/surface.h"
|
||||
#include "runtime/os_interface/debug_settings_manager.h"
|
||||
@@ -105,6 +106,7 @@ Kernel::Kernel(Program *programArg, const KernelInfo &kernelInfoArg, const Devic
|
||||
kernelReflectionSurface(nullptr),
|
||||
usingSharedObjArgs(false) {
|
||||
program->retain();
|
||||
imageTransformer.reset(new ImageTransformer);
|
||||
}
|
||||
|
||||
Kernel::~Kernel() {
|
||||
@@ -773,6 +775,7 @@ cl_int Kernel::setArg(uint32_t argIndex, size_t argSize, const void *argVal) {
|
||||
patchedArgumentsNum++;
|
||||
kernelArguments[argIndex].isPatched = true;
|
||||
}
|
||||
resolveArgs();
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
@@ -1210,6 +1213,10 @@ cl_int Kernel::setArgImageWithMipLevel(uint32_t argIndex,
|
||||
auto &imageDesc = pImage->getImageDesc();
|
||||
auto &imageFormat = pImage->getImageFormat();
|
||||
|
||||
if (imageDesc.image_type == CL_MEM_OBJECT_IMAGE3D) {
|
||||
imageTransformer->registerImage3d(argIndex);
|
||||
}
|
||||
|
||||
patch<uint32_t, size_t>(imageDesc.image_width, crossThreadData, kernelArgInfo.offsetImgWidth);
|
||||
patch<uint32_t, size_t>(imageDesc.image_height, crossThreadData, kernelArgInfo.offsetImgHeight);
|
||||
patch<uint32_t, size_t>(imageDesc.image_depth, crossThreadData, kernelArgInfo.offsetImgDepth);
|
||||
@@ -2045,4 +2052,31 @@ cl_int Kernel::checkCorrectImageAccessQualifier(cl_uint argIndex,
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
|
||||
void Kernel::resolveArgs() {
|
||||
if (!Kernel::isPatched() || !imageTransformer->hasRegisteredImages3d() || !canTransformImages())
|
||||
return;
|
||||
bool canTransformImageTo2dArray = true;
|
||||
for (uint32_t i = 0; i < patchedArgumentsNum; i++) {
|
||||
if (kernelInfo.kernelArgInfo.at(i).isSampler) {
|
||||
auto clSamplerObj = *(static_cast<const cl_sampler *>(kernelArguments.at(i).value));
|
||||
auto sampler = castToObjectOrAbort<Sampler>(clSamplerObj);
|
||||
if (sampler->isTransformable()) {
|
||||
canTransformImageTo2dArray = true;
|
||||
} else {
|
||||
canTransformImageTo2dArray = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (canTransformImageTo2dArray) {
|
||||
imageTransformer->transformImagesTo2dArray(kernelInfo, kernelArguments, getSurfaceStateHeap());
|
||||
} else if (imageTransformer->didTransform()) {
|
||||
imageTransformer->transformImagesTo3d(kernelInfo, kernelArguments, getSurfaceStateHeap());
|
||||
}
|
||||
}
|
||||
|
||||
bool Kernel::canTransformImages() const {
|
||||
return device.getHardwareInfo().pPlatform->eRenderCoreFamily >= IGFX_GEN9_CORE;
|
||||
}
|
||||
} // namespace OCLRT
|
||||
|
||||
Reference in New Issue
Block a user