New command encoders

Change-Id: I39b0f8a0bff4fa4ff5072e6a6893fb8b41df1768
Signed-off-by: Mateusz Hoppe <mateusz.hoppe@intel.com>
This commit is contained in:
Mateusz Hoppe
2020-01-24 14:58:15 +01:00
committed by sys_ocldev
parent 2e64471f58
commit 5ddabac3c0
11 changed files with 127 additions and 12 deletions

View File

@@ -158,4 +158,27 @@ template <typename GfxFamily>
struct EncodeComputeMode {
static void adjustComputeMode(CommandContainer &container, uint32_t numGrfRequired);
};
} // namespace NEO
template <typename GfxFamily>
struct EncodeSempahore {
using MI_SEMAPHORE_WAIT = typename GfxFamily::MI_SEMAPHORE_WAIT;
using COMPARE_OPERATION = typename GfxFamily::MI_SEMAPHORE_WAIT::COMPARE_OPERATION;
static void programMiSemaphoreWait(MI_SEMAPHORE_WAIT *cmd,
uint64_t compareAddress,
uint32_t compareData,
COMPARE_OPERATION compareMode);
};
template <typename GfxFamily>
struct EncodeAtomic {
using MI_ATOMIC = typename GfxFamily::MI_ATOMIC;
using ATOMIC_OPCODES = typename GfxFamily::MI_ATOMIC::ATOMIC_OPCODES;
using DATA_SIZE = typename GfxFamily::MI_ATOMIC::DATA_SIZE;
static void programMiAtomic(MI_ATOMIC *atomic, uint64_t writeAddress,
ATOMIC_OPCODES opcode,
DATA_SIZE dataSize);
};
} // namespace NEO

View File

@@ -291,4 +291,27 @@ size_t EncodeIndirectParams<Family>::getCmdsSizeForSetGroupSizeIndirect() {
return 3 * (sizeof(MI_LOAD_REGISTER_REG) + sizeof(MI_LOAD_REGISTER_IMM) + sizeof(MI_MATH) + sizeof(MI_MATH_ALU_INST_INLINE) + sizeof(MI_STORE_REGISTER_MEM));
}
} // namespace NEO
template <typename Family>
void EncodeSempahore<Family>::programMiSemaphoreWait(MI_SEMAPHORE_WAIT *cmd,
uint64_t compareAddress,
uint32_t compareData,
COMPARE_OPERATION compareMode) {
*cmd = Family::cmdInitMiSemaphoreWait;
cmd->setCompareOperation(compareMode);
cmd->setSemaphoreDataDword(compareData);
cmd->setSemaphoreGraphicsAddress(compareAddress);
cmd->setWaitMode(MI_SEMAPHORE_WAIT::WAIT_MODE::WAIT_MODE_POLLING_MODE);
}
template <typename Family>
void EncodeAtomic<Family>::programMiAtomic(MI_ATOMIC *atomic, uint64_t writeAddress,
ATOMIC_OPCODES opcode,
DATA_SIZE dataSize) {
*atomic = Family::cmdInitAtomic;
atomic->setAtomicOpcode(opcode);
atomic->setDataSize(dataSize);
atomic->setMemoryAddress(static_cast<uint32_t>(writeAddress & 0x0000FFFFFFFFULL));
atomic->setMemoryAddressHigh(static_cast<uint32_t>(writeAddress >> 32));
}
} // namespace NEO

View File

@@ -25,5 +25,6 @@ template struct EncodeMediaInterfaceDescriptorLoad<Family>;
template struct EncodeStateBaseAddress<Family>;
template struct EncodeStoreMMIO<Family>;
template struct EncodeSurfaceState<Family>;
} // namespace NEO
template struct EncodeAtomic<Family>;
template struct EncodeSempahore<Family>;
} // namespace NEO

View File

@@ -45,5 +45,7 @@ template struct EncodeMediaInterfaceDescriptorLoad<Family>;
template struct EncodeStateBaseAddress<Family>;
template struct EncodeStoreMMIO<Family>;
template struct EncodeSurfaceState<Family>;
template struct EncodeAtomic<Family>;
template struct EncodeSempahore<Family>;
} // namespace NEO
} // namespace NEO

View File

@@ -26,5 +26,7 @@ template struct EncodeMediaInterfaceDescriptorLoad<Family>;
template struct EncodeStateBaseAddress<Family>;
template struct EncodeStoreMMIO<Family>;
template struct EncodeSurfaceState<Family>;
template struct EncodeAtomic<Family>;
template struct EncodeSempahore<Family>;
} // namespace NEO

View File

@@ -26,5 +26,6 @@ template struct EncodeMediaInterfaceDescriptorLoad<Family>;
template struct EncodeStateBaseAddress<Family>;
template struct EncodeStoreMMIO<Family>;
template struct EncodeSurfaceState<Family>;
} // namespace NEO
template struct EncodeAtomic<Family>;
template struct EncodeSempahore<Family>;
} // namespace NEO

View File

@@ -6,10 +6,12 @@
set(NEO_CORE_ENCODERS_TESTS
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
${CMAKE_CURRENT_SOURCE_DIR}/test_encode_atomic.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_encode_dispatch_kernel.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_encode_flush.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_encode_math.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_encode_media_interface_descriptor.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_encode_semaphore.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_encode_set_mmio.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_encode_states.cpp
)

View File

@@ -0,0 +1,26 @@
/*
* Copyright (C) 2020 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "core/helpers/ptr_math.h"
#include "core/unit_tests/fixtures/command_container_fixture.h"
#include "unit_tests/gen_common/gen_cmd_parse.h"
using namespace NEO;
using CommandEncodeAtomic = Test<CommandEncodeStatesFixture>;
HWTEST_F(CommandEncodeAtomic, programMiAtomic) {
using MI_ATOMIC = typename FamilyType::MI_ATOMIC;
MI_ATOMIC miAtomic;
EncodeAtomic<FamilyType>::programMiAtomic(&miAtomic, 0x123400, MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_4B_DECREMENT,
MI_ATOMIC::DATA_SIZE::DATA_SIZE_DWORD);
EXPECT_EQ(MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_4B_DECREMENT, miAtomic.getAtomicOpcode());
EXPECT_EQ(MI_ATOMIC::DATA_SIZE::DATA_SIZE_DWORD, miAtomic.getDataSize());
EXPECT_EQ(0x123400u, miAtomic.getMemoryAddress());
}

View File

@@ -0,0 +1,29 @@
/*
* Copyright (C) 2020 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "core/helpers/ptr_math.h"
#include "core/unit_tests/fixtures/command_container_fixture.h"
#include "unit_tests/gen_common/gen_cmd_parse.h"
using namespace NEO;
using CommandEncodeSemaphore = Test<CommandEncodeStatesFixture>;
HWTEST_F(CommandEncodeSemaphore, programMiSemaphoreWait) {
using MI_SEMAPHORE_WAIT = typename FamilyType::MI_SEMAPHORE_WAIT;
MI_SEMAPHORE_WAIT miSemaphore;
EncodeSempahore<FamilyType>::programMiSemaphoreWait(&miSemaphore,
0x123400,
4,
MI_SEMAPHORE_WAIT::COMPARE_OPERATION::COMPARE_OPERATION_SAD_NOT_EQUAL_SDD);
EXPECT_EQ(MI_SEMAPHORE_WAIT::COMPARE_OPERATION::COMPARE_OPERATION_SAD_NOT_EQUAL_SDD, miSemaphore.getCompareOperation());
EXPECT_EQ(4u, miSemaphore.getSemaphoreDataDword());
EXPECT_EQ(0x123400u, miSemaphore.getSemaphoreGraphicsAddress());
EXPECT_EQ(MI_SEMAPHORE_WAIT::WAIT_MODE::WAIT_MODE_POLLING_MODE, miSemaphore.getWaitMode());
}