Skip to content

Commit 38aa884

Browse files
Select GMM_RESOURCE_USAGE_OCL_BUFFER_CONST policy for read-only OCL buffers
Change-Id: I338d1a1cf90c5b48009357d79b036d6d50e54b4a Signed-off-by: Maciej Dziuban <maciej.dziuban@intel.com>
1 parent cdb5240 commit 38aa884

File tree

5 files changed

+73
-12
lines changed

5 files changed

+73
-12
lines changed

runtime/mem_obj/buffer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ extern BufferFuncs bufferFactory[IGFX_MAX_CORE];
3838

3939
class Buffer : public MemObj {
4040
public:
41-
const static size_t maxBufferSizeForReadWriteOnCpu = 10 * MB;
42-
const static cl_ulong maskMagic = 0xFFFFFFFFFFFFFFFFLL;
43-
static const cl_ulong objectMagic = MemObj::objectMagic | 0x02;
41+
constexpr static size_t maxBufferSizeForReadWriteOnCpu = 10 * MB;
42+
constexpr static cl_ulong maskMagic = 0xFFFFFFFFFFFFFFFFLL;
43+
constexpr static cl_ulong objectMagic = MemObj::objectMagic | 0x02;
4444
bool forceDisallowCPUCopy = false;
4545

4646
~Buffer() override;

runtime/mem_obj/buffer.inl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,11 @@ void BufferHw<GfxFamily>::setArgStateful(void *memory, bool forceNonAuxMode, boo
6666
surfaceState->setTileMode(RENDER_SURFACE_STATE::TILE_MODE_LINEAR);
6767
surfaceState->setVerticalLineStride(0);
6868
surfaceState->setVerticalLineStrideOffset(0);
69-
if (!disableL3Cache &&
70-
((isAligned<MemoryConstants::cacheLineSize>(bufferAddress) && isAligned<MemoryConstants::cacheLineSize>(bufferSize)) ||
71-
isValueSet(getFlags(), CL_MEM_READ_ONLY) || !this->isMemObjZeroCopy()) &&
72-
!this->isMemObjUncacheable()) {
73-
surfaceState->setMemoryObjectControlState(gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_BUFFER));
69+
const bool readOnlyMemObj = isValueSet(getFlags(), CL_MEM_READ_ONLY);
70+
const bool alignedMemObj = isAligned<MemoryConstants::cacheLineSize>(bufferAddress) && isAligned<MemoryConstants::cacheLineSize>(bufferSize);
71+
if (!disableL3Cache && !this->isMemObjUncacheable() && (alignedMemObj || readOnlyMemObj || !this->isMemObjZeroCopy())) {
72+
const auto usage = readOnlyMemObj ? GMM_RESOURCE_USAGE_OCL_BUFFER_CONST : GMM_RESOURCE_USAGE_OCL_BUFFER;
73+
surfaceState->setMemoryObjectControlState(gmmHelper->getMOCS(usage));
7474
} else {
7575
surfaceState->setMemoryObjectControlState(gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_BUFFER_CACHELINE_MISALIGNED));
7676
}

runtime/mem_obj/mem_obj.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ struct OpenCLObjectMapper<_cl_mem> {
3333

3434
class MemObj : public BaseObject<_cl_mem> {
3535
public:
36-
const static cl_ulong maskMagic = 0xFFFFFFFFFFFFFF00LL;
37-
static const cl_ulong objectMagic = 0xAB2212340CACDD00LL;
36+
constexpr static cl_ulong maskMagic = 0xFFFFFFFFFFFFFF00LL;
37+
constexpr static cl_ulong objectMagic = 0xAB2212340CACDD00LL;
3838

3939
MemObj(Context *context,
4040
cl_mem_object_type memObjectType,

unit_tests/mem_obj/buffer_tests.cpp

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1205,7 +1205,7 @@ HWTEST_F(BufferSetSurfaceTests, givenBufferSetSurfaceThatMemoryIsUnalignedToCach
12051205

12061206
auto mocs = surfaceState.getMemoryObjectControlState();
12071207
auto gmmHelper = device->getGmmHelper();
1208-
EXPECT_EQ(gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_BUFFER), mocs);
1208+
EXPECT_EQ(gmmHelper->getMOCS(GMM_RESOURCE_USAGE_OCL_BUFFER_CONST), mocs);
12091209

12101210
alignedFree(ptr);
12111211
}
@@ -1363,6 +1363,56 @@ HWTEST_F(BufferSetSurfaceTests, givenBufferWhenSetArgStatefulWithL3ChacheDisable
13631363
alignedFree(ptr);
13641364
}
13651365

1366+
HWTEST_F(BufferSetSurfaceTests, givenAlignedCacheableReadOnlyBufferThenChoseOclBufferConstPolicy) {
1367+
MockContext context;
1368+
const auto size = MemoryConstants::pageSize;
1369+
const auto ptr = (void *)alignedMalloc(size * 2, MemoryConstants::pageSize);
1370+
const auto flags = CL_MEM_USE_HOST_PTR | CL_MEM_READ_ONLY;
1371+
1372+
auto retVal = CL_SUCCESS;
1373+
auto buffer = std::unique_ptr<Buffer>(Buffer::create(
1374+
&context,
1375+
flags,
1376+
size,
1377+
ptr,
1378+
retVal));
1379+
EXPECT_EQ(CL_SUCCESS, retVal);
1380+
1381+
typename FamilyType::RENDER_SURFACE_STATE surfaceState = {};
1382+
buffer->setArgStateful(&surfaceState, false, false);
1383+
1384+
const auto expectedMocs = device->getGmmHelper()->getMOCS(GMM_RESOURCE_USAGE_OCL_BUFFER_CONST);
1385+
const auto actualMocs = surfaceState.getMemoryObjectControlState();
1386+
EXPECT_EQ(expectedMocs, actualMocs);
1387+
1388+
alignedFree(ptr);
1389+
}
1390+
1391+
HWTEST_F(BufferSetSurfaceTests, givenAlignedCacheableNonReadOnlyBufferThenChooseOclBufferPolicy) {
1392+
MockContext context;
1393+
const auto size = MemoryConstants::pageSize;
1394+
const auto ptr = (void *)alignedMalloc(size * 2, MemoryConstants::pageSize);
1395+
const auto flags = CL_MEM_USE_HOST_PTR;
1396+
1397+
auto retVal = CL_SUCCESS;
1398+
auto buffer = std::unique_ptr<Buffer>(Buffer::create(
1399+
&context,
1400+
flags,
1401+
size,
1402+
ptr,
1403+
retVal));
1404+
EXPECT_EQ(CL_SUCCESS, retVal);
1405+
1406+
typename FamilyType::RENDER_SURFACE_STATE surfaceState = {};
1407+
buffer->setArgStateful(&surfaceState, false, false);
1408+
1409+
const auto expectedMocs = device->getGmmHelper()->getMOCS(GMM_RESOURCE_USAGE_OCL_BUFFER);
1410+
const auto actualMocs = surfaceState.getMemoryObjectControlState();
1411+
EXPECT_EQ(expectedMocs, actualMocs);
1412+
1413+
alignedFree(ptr);
1414+
}
1415+
13661416
HWTEST_F(BufferSetSurfaceTests, givenRenderCompressedGmmResourceWhenSurfaceStateIsProgrammedThenSetAuxParams) {
13671417
using RENDER_SURFACE_STATE = typename FamilyType::RENDER_SURFACE_STATE;
13681418
using AUXILIARY_SURFACE_MODE = typename RENDER_SURFACE_STATE::AUXILIARY_SURFACE_MODE;

unit_tests/mocks/mock_gmm_client_context_base.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,19 @@ MockGmmClientContextBase::MockGmmClientContextBase(GMM_CLIENT clientType, GmmExp
1414
MEMORY_OBJECT_CONTROL_STATE MockGmmClientContextBase::cachePolicyGetMemoryObject(GMM_RESOURCE_INFO *pResInfo, GMM_RESOURCE_USAGE_TYPE usage) {
1515
MEMORY_OBJECT_CONTROL_STATE retVal = {};
1616
memset(&retVal, 0, sizeof(MEMORY_OBJECT_CONTROL_STATE));
17-
if (usage != GMM_RESOURCE_USAGE_OCL_BUFFER_CACHELINE_MISALIGNED) {
17+
switch (usage) {
18+
case GMM_RESOURCE_USAGE_OCL_BUFFER:
19+
retVal.DwordValue = 6u;
20+
break;
21+
case GMM_RESOURCE_USAGE_OCL_BUFFER_CONST:
22+
retVal.DwordValue = 5u;
23+
break;
24+
case GMM_RESOURCE_USAGE_OCL_BUFFER_CACHELINE_MISALIGNED:
25+
retVal.DwordValue = 0u;
26+
break;
27+
default:
1828
retVal.DwordValue = 4u;
29+
break;
1930
}
2031
return retVal;
2132
}

0 commit comments

Comments
 (0)