blob: 9bbbca46b901179128ccd732997aee7a9b71a09b [file] [log] [blame]
/*
* Copyright (c) 2017, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
#include <vector>
#include "cm_test.h"
// The kernel names is "DoNothing" on all Gen platforms.
static uint8_t BROADWELL_DONOTHING_ISA[]
= {0x43, 0x49, 0x53, 0x41, 0x03, 0x06, 0x01, 0x00, 0x09, 0x44, 0x6f, 0x4e, 0x6f,
0x74, 0x68, 0x69, 0x6e, 0x67, 0x30, 0x00, 0x00, 0x00, 0x67, 0x01, 0x00, 0x00,
0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x97, 0x01, 0x00,
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
0x44, 0x6f, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x00, 0x6e, 0x75, 0x6c,
0x6c, 0x00, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x78, 0x00, 0x74, 0x68,
0x72, 0x65, 0x61, 0x64, 0x5f, 0x79, 0x00, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f,
0x69, 0x64, 0x5f, 0x78, 0x00, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64,
0x5f, 0x79, 0x00, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x5f, 0x7a,
0x00, 0x74, 0x73, 0x63, 0x00, 0x72, 0x30, 0x00, 0x61, 0x72, 0x67, 0x00, 0x72,
0x65, 0x74, 0x76, 0x61, 0x6c, 0x00, 0x73, 0x70, 0x00, 0x66, 0x70, 0x00, 0x68,
0x77, 0x5f, 0x69, 0x64, 0x00, 0x73, 0x72, 0x30, 0x00, 0x63, 0x72, 0x30, 0x00,
0x63, 0x65, 0x30, 0x00, 0x64, 0x62, 0x67, 0x30, 0x00, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x00, 0x54, 0x30, 0x00, 0x54, 0x31, 0x00, 0x54, 0x32, 0x00, 0x54, 0x33,
0x00, 0x54, 0x32, 0x35, 0x32, 0x00, 0x54, 0x32, 0x35, 0x35, 0x00, 0x53, 0x33,
0x31, 0x00, 0x56, 0x33, 0x32, 0x00, 0x56, 0x33, 0x33, 0x00, 0x44, 0x6f, 0x4e,
0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x42, 0x42, 0x5f, 0x30, 0x5f, 0x31,
0x00, 0x41, 0x73, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x00, 0x4e, 0x6f, 0x42, 0x61,
0x72, 0x72, 0x69, 0x65, 0x72, 0x00, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00,
0x64, 0x3a, 0x5c, 0x64, 0x6f, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x5f,
0x67, 0x65, 0x6e, 0x78, 0x2e, 0x63, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x27, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x21, 0x00,
0x00, 0x00, 0x24, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, 0x56, 0x01, 0x00,
0x00, 0x03, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x14, 0x64, 0x6f, 0x6e, 0x6f, 0x74,
0x68, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x65, 0x6e, 0x78, 0x5f, 0x30, 0x2e, 0x61,
0x73, 0x6d, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x00,
0x30, 0x00, 0x00, 0x51, 0x20, 0x00, 0x00, 0x00, 0x52, 0x03, 0x00, 0x00, 0x00,
0x34, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x00, 0x00, 0x31,
0x00, 0x00, 0x07, 0x00, 0x3a, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00,
0x00, 0x82};
static uint8_t SKYLAKE_DONOTHING_ISA[]
= {0x43, 0x49, 0x53, 0x41, 0x03, 0x06, 0x01, 0x00, 0x09, 0x44, 0x6f, 0x4e, 0x6f,
0x74, 0x68, 0x69, 0x6e, 0x67, 0x30, 0x00, 0x00, 0x00, 0x67, 0x01, 0x00, 0x00,
0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x97, 0x01, 0x00,
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
0x44, 0x6f, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x00, 0x6e, 0x75, 0x6c,
0x6c, 0x00, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x78, 0x00, 0x74, 0x68,
0x72, 0x65, 0x61, 0x64, 0x5f, 0x79, 0x00, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f,
0x69, 0x64, 0x5f, 0x78, 0x00, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64,
0x5f, 0x79, 0x00, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x5f, 0x7a,
0x00, 0x74, 0x73, 0x63, 0x00, 0x72, 0x30, 0x00, 0x61, 0x72, 0x67, 0x00, 0x72,
0x65, 0x74, 0x76, 0x61, 0x6c, 0x00, 0x73, 0x70, 0x00, 0x66, 0x70, 0x00, 0x68,
0x77, 0x5f, 0x69, 0x64, 0x00, 0x73, 0x72, 0x30, 0x00, 0x63, 0x72, 0x30, 0x00,
0x63, 0x65, 0x30, 0x00, 0x64, 0x62, 0x67, 0x30, 0x00, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x00, 0x54, 0x30, 0x00, 0x54, 0x31, 0x00, 0x54, 0x32, 0x00, 0x54, 0x33,
0x00, 0x54, 0x32, 0x35, 0x32, 0x00, 0x54, 0x32, 0x35, 0x35, 0x00, 0x53, 0x33,
0x31, 0x00, 0x56, 0x33, 0x32, 0x00, 0x56, 0x33, 0x33, 0x00, 0x44, 0x6f, 0x4e,
0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x42, 0x42, 0x5f, 0x30, 0x5f, 0x31,
0x00, 0x41, 0x73, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x00, 0x4e, 0x6f, 0x42, 0x61,
0x72, 0x72, 0x69, 0x65, 0x72, 0x00, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00,
0x64, 0x3a, 0x5c, 0x64, 0x6f, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x5f,
0x67, 0x65, 0x6e, 0x78, 0x2e, 0x63, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x27, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x21, 0x00,
0x00, 0x00, 0x24, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, 0x56, 0x01, 0x00,
0x00, 0x03, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x14, 0x64, 0x6f, 0x6e, 0x6f, 0x74,
0x68, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x65, 0x6e, 0x78, 0x5f, 0x30, 0x2e, 0x61,
0x73, 0x6d, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x00,
0x30, 0x00, 0x00, 0x51, 0x20, 0x00, 0x00, 0x00, 0x52, 0x03, 0x00, 0x00, 0x00,
0x34, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x00, 0x00, 0x31,
0x00, 0x00, 0x07, 0x00, 0x02, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00,
0x00, 0x82};
static uint8_t BROXTON_DONOTHING_ISA[]
= {0x43, 0x49, 0x53, 0x41, 0x03, 0x06, 0x01, 0x00, 0x09, 0x44, 0x6f, 0x4e, 0x6f,
0x74, 0x68, 0x69, 0x6e, 0x67, 0x30, 0x00, 0x00, 0x00, 0x67, 0x01, 0x00, 0x00,
0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x97, 0x01, 0x00,
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
0x44, 0x6f, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x00, 0x6e, 0x75, 0x6c,
0x6c, 0x00, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x78, 0x00, 0x74, 0x68,
0x72, 0x65, 0x61, 0x64, 0x5f, 0x79, 0x00, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f,
0x69, 0x64, 0x5f, 0x78, 0x00, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64,
0x5f, 0x79, 0x00, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x5f, 0x7a,
0x00, 0x74, 0x73, 0x63, 0x00, 0x72, 0x30, 0x00, 0x61, 0x72, 0x67, 0x00, 0x72,
0x65, 0x74, 0x76, 0x61, 0x6c, 0x00, 0x73, 0x70, 0x00, 0x66, 0x70, 0x00, 0x68,
0x77, 0x5f, 0x69, 0x64, 0x00, 0x73, 0x72, 0x30, 0x00, 0x63, 0x72, 0x30, 0x00,
0x63, 0x65, 0x30, 0x00, 0x64, 0x62, 0x67, 0x30, 0x00, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x00, 0x54, 0x30, 0x00, 0x54, 0x31, 0x00, 0x54, 0x32, 0x00, 0x54, 0x33,
0x00, 0x54, 0x32, 0x35, 0x32, 0x00, 0x54, 0x32, 0x35, 0x35, 0x00, 0x53, 0x33,
0x31, 0x00, 0x56, 0x33, 0x32, 0x00, 0x56, 0x33, 0x33, 0x00, 0x44, 0x6f, 0x4e,
0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x42, 0x42, 0x5f, 0x30, 0x5f, 0x31,
0x00, 0x41, 0x73, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x00, 0x4e, 0x6f, 0x42, 0x61,
0x72, 0x72, 0x69, 0x65, 0x72, 0x00, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00,
0x64, 0x3a, 0x5c, 0x64, 0x6f, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x5f,
0x67, 0x65, 0x6e, 0x78, 0x2e, 0x63, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x27, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x21, 0x00,
0x00, 0x00, 0x24, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, 0x56, 0x01, 0x00,
0x00, 0x03, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x14, 0x64, 0x6f, 0x6e, 0x6f, 0x74,
0x68, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x65, 0x6e, 0x78, 0x5f, 0x30, 0x2e, 0x61,
0x73, 0x6d, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x00,
0x30, 0x00, 0x00, 0x51, 0x20, 0x00, 0x00, 0x00, 0x52, 0x03, 0x00, 0x00, 0x00,
0x34, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x00, 0x00, 0x31,
0x00, 0x00, 0x07, 0x00, 0x02, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00,
0x00, 0x82};
static uint8_t CANNONLAKE_DONOTHING_ISA[]
= {0x43, 0x49, 0x53, 0x41, 0x03, 0x06, 0x01, 0x00, 0x09, 0x44, 0x6f, 0x4e, 0x6f,
0x74, 0x68, 0x69, 0x6e, 0x67, 0x30, 0x00, 0x00, 0x00, 0x67, 0x01, 0x00, 0x00,
0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x97, 0x01, 0x00,
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
0x44, 0x6f, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x00, 0x6e, 0x75, 0x6c,
0x6c, 0x00, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x78, 0x00, 0x74, 0x68,
0x72, 0x65, 0x61, 0x64, 0x5f, 0x79, 0x00, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f,
0x69, 0x64, 0x5f, 0x78, 0x00, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64,
0x5f, 0x79, 0x00, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x5f, 0x7a,
0x00, 0x74, 0x73, 0x63, 0x00, 0x72, 0x30, 0x00, 0x61, 0x72, 0x67, 0x00, 0x72,
0x65, 0x74, 0x76, 0x61, 0x6c, 0x00, 0x73, 0x70, 0x00, 0x66, 0x70, 0x00, 0x68,
0x77, 0x5f, 0x69, 0x64, 0x00, 0x73, 0x72, 0x30, 0x00, 0x63, 0x72, 0x30, 0x00,
0x63, 0x65, 0x30, 0x00, 0x64, 0x62, 0x67, 0x30, 0x00, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x00, 0x54, 0x30, 0x00, 0x54, 0x31, 0x00, 0x54, 0x32, 0x00, 0x54, 0x33,
0x00, 0x54, 0x32, 0x35, 0x32, 0x00, 0x54, 0x32, 0x35, 0x35, 0x00, 0x53, 0x33,
0x31, 0x00, 0x56, 0x33, 0x32, 0x00, 0x56, 0x33, 0x33, 0x00, 0x44, 0x6f, 0x4e,
0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x42, 0x42, 0x5f, 0x30, 0x5f, 0x31,
0x00, 0x41, 0x73, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x00, 0x4e, 0x6f, 0x42, 0x61,
0x72, 0x72, 0x69, 0x65, 0x72, 0x00, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00,
0x64, 0x3a, 0x5c, 0x64, 0x6f, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x5f,
0x67, 0x65, 0x6e, 0x78, 0x2e, 0x63, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x27, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x21, 0x00,
0x00, 0x00, 0x24, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, 0x56, 0x01, 0x00,
0x00, 0x03, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x14, 0x64, 0x6f, 0x6e, 0x6f, 0x74,
0x68, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x65, 0x6e, 0x78, 0x5f, 0x30, 0x2e, 0x61,
0x73, 0x6d, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x00,
0x30, 0x00, 0x00, 0x51, 0x20, 0x00, 0x00, 0x00, 0x52, 0x03, 0x00, 0x00, 0x00,
0x34, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x00, 0x00, 0x31,
0x00, 0x00, 0x07, 0x00, 0x3a, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00,
0x00, 0x82};
struct IsaData
{
IsaData(): binary(nullptr),
size(0),
options(nullptr) {}
IsaData(uint8_t *in_binary,
size_t in_size,
char *in_options): binary(in_binary),
size(in_size),
options(in_options) {}
uint8_t *binary;
size_t size;
char *options;
};
typedef std::vector<IsaData> IsaArray;
using CMRT_UMD::CmSampler;
using CMRT_UMD::CmSampler8x8;
class KernelTest: public CmTest
{
public:
KernelTest(): m_program(nullptr), m_kernel(nullptr) {}
~KernelTest() {}
int32_t LoadDestroyProgram(uint8_t *isa_code,
uint32_t size,
const char *options)
{
if (nullptr == options)
{
options = "nojitter";
}
int32_t result = m_mockDevice->LoadProgram(isa_code, size, m_program,
options);
if (result != CM_SUCCESS)
{
return result;
}
return m_mockDevice->DestroyProgram(m_program);
}//================================================
//*-------------------------------------------------------------------------
//| Selects ISA code, size and options from an array and loads them as a
//| CmProgram.
//*-------------------------------------------------------------------------
int32_t SelectLoadDestroyProgram(IsaArray *isa_array)
{
IsaData *isa_data = FindIsaData(isa_array);
return LoadDestroyProgram(isa_data->binary,
static_cast<uint32_t>(isa_data->size),
isa_data->options);
}
//*-------------------------------------------------------------------------
//| Creates a kernel from the default ISA code.
//*-------------------------------------------------------------------------
int32_t CreateKernel(const char *kernel_name)
{
if (nullptr == kernel_name) // Tests the return value if CmProgram is invalid.
{
return m_mockDevice->CreateKernel(nullptr, "DoNothing", m_kernel,
nullptr);
}
int32_t result = CreateKernelFromDefaultIsa(kernel_name);
if (CM_SUCCESS == result)
{
uint32_t spill_size = 0;
int32_t temp_result = m_kernel->QuerySpillSize(spill_size);
EXPECT_EQ(CM_FAILURE, temp_result);
}
DestroyKernel();
return result;
}//===============
int32_t SetArgument(uint32_t index,
size_t size,
const void *value)
{
int32_t result = CreateKernelFromDefaultIsa("DoNothing");
EXPECT_EQ(CM_SUCCESS, result);
result = m_kernel->SetKernelArg(index, size, value);
DestroyKernel();
return result;
}//===============
//*-------------------------------------------------------------------------
//| Sets sampler BTI for CmSampler.
//*-------------------------------------------------------------------------
template<class SamplerType, class Function >
int32_t SetSamplerBTI(int sampler_count,
uint32_t binding_table_index,
Function Create)
{
int32_t result = CreateKernelFromDefaultIsa("DoNothing");
EXPECT_EQ(CM_SUCCESS, result);
SamplerType *samplers[2];
samplers[0] = samplers[1] = nullptr;
for (int i = 0; i < sampler_count; ++i)
{
samplers[i] = Create();
EXPECT_NE(nullptr, samplers[i]);
}
if (0 == sampler_count)
{
++sampler_count; // Test for nullptr;
}
SamplerIndex *sampler_index = nullptr;
int32_t return_value = 0;
for (int i = 0; i < sampler_count; ++i)
{
if (nullptr != samplers[i])
{
result = samplers[i]->GetIndex(sampler_index);
EXPECT_EQ(CM_SUCCESS, result);
}
result = m_kernel->SetSamplerBTI(sampler_index,
binding_table_index);
if (0 == i)
{
return_value = result;
}
else
{
EXPECT_EQ(CM_FAILURE, result);
}
}
for (int i = 0; i < sampler_count; ++i)
{
if (nullptr != samplers[i])
{
result = DestroySampler(samplers[i]);
EXPECT_EQ(CM_SUCCESS, result);
}
}
DestroyKernel();
return return_value;
}
protected:
//*-------------------------------------------------------------------------
//| Creates CmSampler.
//*-------------------------------------------------------------------------
CmSampler* CreateSampler()
{
CM_SAMPLER_STATE sampler_state;
sampler_state.magFilterType = CM_TEXTURE_FILTER_TYPE_LINEAR;
sampler_state.minFilterType = CM_TEXTURE_FILTER_TYPE_LINEAR;
sampler_state.addressU = CM_TEXTURE_ADDRESS_CLAMP;
sampler_state.addressV = CM_TEXTURE_ADDRESS_CLAMP;
sampler_state.addressW = CM_TEXTURE_ADDRESS_CLAMP;
CmSampler *sampler = nullptr;
m_mockDevice->CreateSampler(sampler_state, sampler);
return sampler;
}
//*-------------------------------------------------------------------------
//| Creates CmSampler8x8.
//*-------------------------------------------------------------------------
CmSampler8x8* CreateSampler8x8()
{
CM_AVS_NONPIPLINED_STATE nonpipelined_state;
nonpipelined_state.BypassXAF = nonpipelined_state.BypassYAF = 1;
nonpipelined_state.DefaultSharpLvl = 255;
nonpipelined_state.maxDerivative4Pixels = 7;
nonpipelined_state.maxDerivative8Pixels = 20;
nonpipelined_state.transitionArea4Pixels = 4;
nonpipelined_state.transitionArea8Pixels = 5;
CM_AVS_STATE_MSG state_message;
state_message.AvsState = &nonpipelined_state;
state_message.AVSTYPE = 0;
state_message.BypassIEF = 1;
state_message.GainFactor = 44;
state_message.GlobalNoiseEstm = 255;
state_message.StrongEdgeThr = 8;
state_message.WeakEdgeThr = 1;
state_message.StrongEdgeWght = 7;
state_message.RegularWght = 2;
state_message.NonEdgeWght = 1;
state_message.wR3xCoefficient = 6;
state_message.wR3cCoefficient = 15;
state_message.wR5xCoefficient = 9;
state_message.wR5cxCoefficient = 8;
state_message.wR5cCoefficient = 3;
CM_SAMPLER_8X8_DESCR descriptor;
descriptor.stateType = CM_SAMPLER8X8_AVS;
descriptor.avs = &state_message;
CmSampler8x8 *sampler8x8 = nullptr;
m_mockDevice->CreateSampler8x8(descriptor, sampler8x8);
return sampler8x8;
}
//*-------------------------------------------------------------------------
//| Resets the default ISA array.
//*-------------------------------------------------------------------------
bool ResetDefaultIsaArray();
//*-------------------------------------------------------------------------
//| Sets pointers to ISA binaries in the default ISA array.
//*-------------------------------------------------------------------------
bool SetDefaultIsaArrayBinaries();
//*-------------------------------------------------------------------------
//| Sets sizs of ISA binaries in the default ISA array.
//*-------------------------------------------------------------------------
bool SetDefaultIsaArraySizes();
// Array of default ISA data.
IsaArray m_isaArray;
private:
//*-------------------------------------------------------------------------
//| Finds the index of the ISA data corresponding to the platform in test.
//*-------------------------------------------------------------------------
IsaData* FindIsaData(IsaArray *isa_array);
int32_t CreateKernelFromDefaultIsa(const char *kernel_name)
{
ResetDefaultIsaArray();
SetDefaultIsaArrayBinaries();
SetDefaultIsaArraySizes();
IsaData *current_isa_data = FindIsaData(&m_isaArray);
int32_t result
= m_mockDevice->LoadProgram(
current_isa_data->binary,
static_cast<uint32_t>(current_isa_data->size),
m_program, "nojitter");
EXPECT_EQ(CM_SUCCESS, result);
return m_mockDevice->CreateKernel(m_program, kernel_name, m_kernel,
nullptr);
}//============================================
int32_t DestroyKernel()
{
int32_t result = CM_SUCCESS;
if (nullptr != m_kernel)
{
result = m_mockDevice->DestroyKernel(m_kernel);
EXPECT_EQ(CM_SUCCESS, result);
}
if (nullptr != m_program)
{
result = m_mockDevice->DestroyProgram(m_program);
EXPECT_EQ(CM_SUCCESS, result);
}
return result;
}//===============
int32_t DestroySampler(CmSampler *sampler)
{
return m_mockDevice->DestroySampler(sampler);
}
int32_t DestroySampler(CmSampler8x8 *sampler)
{
return m_mockDevice->DestroySampler8x8(sampler);
}
CMRT_UMD::CmProgram *m_program;
CMRT_UMD::CmKernel *m_kernel;
};
TEST_F(KernelTest, LoadDestroyProgram)
{
ResetDefaultIsaArray();
RunEach<int32_t>(CM_INVALID_COMMON_ISA,
[this]()
{ return SelectLoadDestroyProgram(&m_isaArray); });
SetDefaultIsaArrayBinaries();
RunEach<int32_t>(CM_INVALID_COMMON_ISA,
[this]()
{ return SelectLoadDestroyProgram(&m_isaArray); });
SetDefaultIsaArraySizes();
for_each(m_isaArray.begin(), m_isaArray.end(),
[](IsaData &isa_data) { --isa_data.size; });
RunEach<int32_t>(CM_SUCCESS,
[this]()
{ return SelectLoadDestroyProgram(&m_isaArray); });
for_each(m_isaArray.begin(), m_isaArray.end(),
[](IsaData &isa_data) { ++isa_data.size; }); // Correct sizes.
RunEach<int32_t>(CM_SUCCESS,
[this]()
{ return SelectLoadDestroyProgram(&m_isaArray); });
char options[CM_MAX_OPTION_SIZE_IN_BYTE + 1];
for (int i = 0; i < CM_MAX_OPTION_SIZE_IN_BYTE; ++i)
{
options[i] = '0';
}
options[CM_MAX_OPTION_SIZE_IN_BYTE] = 0;
char *options_ptr = options; // Uses a pointer instead if an array name.
for_each(m_isaArray.begin(), m_isaArray.end(),
[options_ptr](IsaData &isa_data)
{ isa_data.options = options_ptr; });
RunEach<int32_t>(CM_INVALID_ARG_VALUE,
[this]()
{ return SelectLoadDestroyProgram(&m_isaArray); });
return;
}//========
TEST_F(KernelTest, LoadWrongIsa)
{
const uint32_t CODE_SIZE = sizeof(SKYLAKE_DONOTHING_ISA);
uint8_t wrong_isa_code[CODE_SIZE];
memcpy_s(wrong_isa_code, CODE_SIZE, SKYLAKE_DONOTHING_ISA, CODE_SIZE);
wrong_isa_code[0x23] = 0xff;
uint8_t *wrong_isa_code_ptr = wrong_isa_code;
ResetDefaultIsaArray();
auto SetIsaArray = [wrong_isa_code_ptr, CODE_SIZE](IsaData &isa_data) {
isa_data.binary = wrong_isa_code_ptr;
isa_data.size = CODE_SIZE; };
for_each(m_isaArray.begin(), m_isaArray.end(), SetIsaArray);
RunEach<int32_t>(CM_INVALID_GENX_BINARY,
[this]()
{ return SelectLoadDestroyProgram(&m_isaArray); });
return;
}//========
TEST_F(KernelTest, CreateKernel)
{
RunEach<int32_t>(CM_FAILURE,
[this]() { return CreateKernel("wrong_name"); });
RunEach<int32_t>(CM_NULL_POINTER,
[this]() { return CreateKernel(nullptr); });
return;
}//========
TEST_F(KernelTest, SetArgument)
{
int arg0_value = 10;
void *arg0_ptr = &arg0_ptr;
RunEach<int32_t>(CM_SUCCESS,
[this, arg0_ptr]() { return SetArgument(0, sizeof(int),
arg0_ptr); });
RunEach<int32_t>(CM_INVALID_ARG_INDEX,
[this, arg0_ptr]() { return SetArgument(2, sizeof(int),
arg0_ptr); });
RunEach<int32_t>(CM_INVALID_ARG_SIZE,
[this, arg0_ptr]() { return SetArgument(0, sizeof(int) + 1,
arg0_ptr); });
RunEach<int32_t>(CM_INVALID_ARG_SIZE,
[this, arg0_ptr]() { return SetArgument(0, sizeof(int) - 1,
arg0_ptr); });
RunEach<int32_t>(CM_INVALID_ARG_SIZE,
[this, arg0_ptr]()
{ return SetArgument(0, 0, arg0_ptr); });
RunEach<int32_t>(CM_INVALID_ARG_VALUE,
[this, arg0_ptr]() { return SetArgument(0, sizeof(int),
nullptr); });
return;
}//========
TEST_F(KernelTest, SetSamplerBTI)
{
auto CreateSampler = [this]() { return this->CreateSampler(); };
RunEach<int32_t>(CM_NULL_POINTER,
[this, &CreateSampler]() {
return SetSamplerBTI<CmSampler>(0, 5,
CreateSampler); });
static const uint32_t MAX_INDEX = 15;
RunEach<int32_t>(CM_KERNELPAYLOAD_SAMPLER_INVALID_BTINDEX,
[this, &CreateSampler]() {
return SetSamplerBTI<CmSampler>(1, MAX_INDEX + 1,
CreateSampler); });
RunEach<int32_t>(CM_SUCCESS,
[this, &CreateSampler]() {
return SetSamplerBTI<CmSampler>(2, 5,
CreateSampler); });
auto CreateSampler8x8 = [this]() { return this->CreateSampler8x8(); };
RunEach<int32_t>(CM_KERNELPAYLOAD_SAMPLER_INVALID_BTINDEX,
[this, &CreateSampler8x8]() {
return SetSamplerBTI<CmSampler8x8>(
1, MAX_INDEX + 1, CreateSampler8x8); });
RunEach<int32_t>(CM_SUCCESS,
[this, &CreateSampler8x8]() {
return SetSamplerBTI<CmSampler8x8>(
2, 5, CreateSampler8x8); });
return;
}