Enable transforming image 3d to image 2d array

Change-Id: I8fdc6899780481bdebeaf858a330e9dea822bda3
This commit is contained in:
Mateusz Jablonski
2018-03-27 14:30:05 +02:00
parent 0a97dfbb2f
commit 79a0e3253e
24 changed files with 867 additions and 6 deletions

View File

@@ -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