From e0f4740fc4f4c0a87f6421070cd79985bd0a28da Mon Sep 17 00:00:00 2001 From: foreman Date: Tue, 20 Feb 2018 14:15:36 -0500 Subject: [PATCH] P4 to Git Change 1517501 by asalmanp@asalmanp-ocl-stg on 2018/02/20 13:54:28 SWDEV-132899 - [OCL][GFX10] OCLCreateImage[3] fails for the image type 1Darray Issue: FillImage blit kernel is not working properly on gfx10 if the image type is 1Darray (i.e., it only fills the first slice/layer and ignores the rest of the layers when number of layers >1) Root cause: gfx10 HW expects the number of layers in Z component Fix: To fix this issue we swap the Y and Z components if the image type is 1Darray for gfx10+ in image blit kernels. ReviewBoardURL = http://ocltc.amd.com/reviews/r/14281/diff/ Affected files ... ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palblit.cpp#17 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palsettings.cpp#42 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palsettings.hpp#14 edit --- rocclr/runtime/device/pal/palblit.cpp | 49 +++++++++++++++++++++++ rocclr/runtime/device/pal/palsettings.cpp | 4 ++ rocclr/runtime/device/pal/palsettings.hpp | 3 +- 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/rocclr/runtime/device/pal/palblit.cpp b/rocclr/runtime/device/pal/palblit.cpp index 893f763e28..30a7143b9e 100644 --- a/rocclr/runtime/device/pal/palblit.cpp +++ b/rocclr/runtime/device/pal/palblit.cpp @@ -1017,6 +1017,8 @@ bool KernelBlitManager::copyBufferToImageKernel(device::Memory& srcMemory, bool releaseView = false; bool result = false; amd::Image::Format newFormat(gpuMem(dstMemory).desc().format_); + bool swapLayer = (dstView->desc().topology_ == CL_MEM_OBJECT_IMAGE1D_ARRAY) && + dev().settings().gfx10Plus_; // Find unsupported formats for (uint i = 0; i < RejectedFormatDataTotal; ++i) { @@ -1072,6 +1074,14 @@ bool KernelBlitManager::copyBufferToImageKernel(device::Memory& srcMemory, globalWorkSize[2] = amd::alignUp(size[2], 1); localWorkSize[0] = localWorkSize[1] = 16; localWorkSize[2] = 1; + // Swap the Y and Z components, apparently gfx10 HW expects + // layer in Z + if (swapLayer) { + globalWorkSize[2] = globalWorkSize[1]; + globalWorkSize[1] = 1; + localWorkSize[2] = localWorkSize[1]; + localWorkSize[1] = 1; + } } else { globalWorkSize[0] = amd::alignUp(size[0], 8); globalWorkSize[1] = amd::alignUp(size[1], 8); @@ -1102,6 +1112,13 @@ bool KernelBlitManager::copyBufferToImageKernel(device::Memory& srcMemory, cl_int dstOrg[4] = {(cl_int)dstOrigin[0], (cl_int)dstOrigin[1], (cl_int)dstOrigin[2], 0}; cl_int copySize[4] = {(cl_int)size[0], (cl_int)size[1], (cl_int)size[2], 0}; + if (swapLayer) { + dstOrg[2] = dstOrg[1]; + dstOrg[1] = 0; + copySize[2] = copySize[1]; + copySize[1] = 1; + } + setArgument(kernels_[blitType], 3, sizeof(dstOrg), dstOrg); setArgument(kernels_[blitType], 4, sizeof(copySize), copySize); @@ -1320,6 +1337,8 @@ bool KernelBlitManager::copyImageToBufferKernel(device::Memory& srcMemory, bool releaseView = false; bool result = false; amd::Image::Format newFormat(gpuMem(srcMemory).desc().format_); + bool swapLayer = (srcView->desc().topology_ == CL_MEM_OBJECT_IMAGE1D_ARRAY) && + dev().settings().gfx10Plus_; // Find unsupported formats for (uint i = 0; i < RejectedFormatDataTotal; ++i) { @@ -1375,6 +1394,14 @@ bool KernelBlitManager::copyImageToBufferKernel(device::Memory& srcMemory, globalWorkSize[2] = amd::alignUp(size[2], 1); localWorkSize[0] = localWorkSize[1] = 16; localWorkSize[2] = 1; + // Swap the Y and Z components, apparently gfx10 HW expects + // layer in Z + if (swapLayer) { + globalWorkSize[2] = globalWorkSize[1]; + globalWorkSize[1] = 1; + localWorkSize[2] = localWorkSize[1]; + localWorkSize[1] = 1; + } } else { globalWorkSize[0] = amd::alignUp(size[0], 8); globalWorkSize[1] = amd::alignUp(size[1], 8); @@ -1397,6 +1424,12 @@ bool KernelBlitManager::copyImageToBufferKernel(device::Memory& srcMemory, cl_int srcOrg[4] = {(cl_int)srcOrigin[0], (cl_int)srcOrigin[1], (cl_int)srcOrigin[2], 0}; cl_int copySize[4] = {(cl_int)size[0], (cl_int)size[1], (cl_int)size[2], 0}; + if (swapLayer) { + srcOrg[2] = srcOrg[1]; + srcOrg[1] = 0; + copySize[2] = copySize[1]; + copySize[1] = 1; + } setArgument(kernels_[blitType], 4, sizeof(srcOrg), srcOrg); uint32_t memFmtSize = gpuMem(srcMemory).elementSize(); uint32_t components = gpuMem(srcMemory).numComponents(); @@ -2150,6 +2183,8 @@ bool KernelBlitManager::fillImage(device::Memory& memory, const void* pattern, size_t localWorkSize[3]; Memory* memView = &gpuMem(memory); amd::Image::Format newFormat(gpuMem(memory).owner()->asImage()->getImageFormat()); + bool swapLayer = (memView->desc().topology_ == CL_MEM_OBJECT_IMAGE1D_ARRAY) && + dev().settings().gfx10Plus_; // Program the kernels workload depending on the fill dimensions fillType = FillImage; @@ -2213,6 +2248,14 @@ bool KernelBlitManager::fillImage(device::Memory& memory, const void* pattern, globalWorkSize[2] = amd::alignUp(size[2], 1); localWorkSize[0] = localWorkSize[1] = 16; localWorkSize[2] = 1; + // Swap the Y and Z components, apparently gfx10 HW expects + // layer in Z + if (swapLayer) { + globalWorkSize[2] = globalWorkSize[1]; + globalWorkSize[1] = 1; + localWorkSize[2] = localWorkSize[1]; + localWorkSize[1] = 1; + } } else { globalWorkSize[0] = amd::alignUp(globalWorkSize[0], 8); globalWorkSize[1] = amd::alignUp(size[1], 8); @@ -2230,6 +2273,12 @@ bool KernelBlitManager::fillImage(device::Memory& memory, const void* pattern, cl_int fillOrigin[4] = {(cl_int)origin[0], (cl_int)origin[1], (cl_int)origin[2], 0}; cl_int fillSize[4] = {(cl_int)size[0], (cl_int)size[1], (cl_int)size[2], 0}; + if (swapLayer) { + fillOrigin[2] = fillOrigin[1]; + fillOrigin[1] = 0; + fillSize[2] = fillSize[1]; + fillSize[1] = 1; + } setArgument(kernels_[fillType], 4, sizeof(fillOrigin), fillOrigin); setArgument(kernels_[fillType], 5, sizeof(fillSize), fillSize); diff --git a/rocclr/runtime/device/pal/palsettings.cpp b/rocclr/runtime/device/pal/palsettings.cpp index e7e5060c49..90061bce3f 100644 --- a/rocclr/runtime/device/pal/palsettings.cpp +++ b/rocclr/runtime/device/pal/palsettings.cpp @@ -102,6 +102,7 @@ Settings::Settings() { // Disable ASIC specific features by default viPlus_ = false; aiPlus_ = false; + gfx10Plus_ = false; // Number of compute rings. numComputeRings_ = 0; @@ -165,6 +166,7 @@ bool Settings::create(const Pal::DeviceProperties& palProp, case Pal::AsicRevision::Unknown: switch (palProp.gfxLevel) { case Pal::GfxIpLevel::GfxIp10: + gfx10Plus_ = true; case Pal::GfxIpLevel::GfxIp9: aiPlus_ = true; break; @@ -173,6 +175,8 @@ bool Settings::create(const Pal::DeviceProperties& palProp, return false; } case Pal::AsicRevision::Navi10: + gfx10Plus_ = true; + // Fall through to AI (gfx9) ... case Pal::AsicRevision::Vega20: case Pal::AsicRevision::Vega12: case Pal::AsicRevision::Vega10: diff --git a/rocclr/runtime/device/pal/palsettings.hpp b/rocclr/runtime/device/pal/palsettings.hpp index 39d51967f4..5f0e495e1c 100644 --- a/rocclr/runtime/device/pal/palsettings.hpp +++ b/rocclr/runtime/device/pal/palsettings.hpp @@ -53,6 +53,7 @@ class Settings : public device::Settings { uint syncObject_ : 1; //!< Enable syncobject uint viPlus_ : 1; //!< VI and post VI features uint aiPlus_ : 1; //!< AI and post AI features + uint gfx10Plus_ : 1; //!< gfx10 and post gfx10 features uint threadTraceEnable_ : 1; //!< Thread trace enable uint linearPersistentImage_ : 1; //!< Allocates linear images in persistent uint useSingleScratch_ : 1; //!< Allocates single scratch per device @@ -63,7 +64,7 @@ class Settings : public device::Settings { uint useDeviceQueue_ : 1; //!< Submit to separate device queue uint singleFpDenorm_ : 1; //!< Support Single FP Denorm uint sdamPageFaultWar_ : 1; //!< SDMA page fault workaround - uint reserved_ : 9; + uint reserved_ : 8; }; uint value_; };