Synchronise with Khronos-private Gitlab branch

The maintenance of the conformance tests is moving to Github.

This commit contains all the changes that have been done in
Gitlab since the first public release of the conformance tests.

Signed-off-by: Kevin Petit <kevin.petit@arm.com>
This commit is contained in:
Kevin Petit
2019-02-20 16:36:05 +00:00
committed by Kévin Petit
parent 95196e7fb4
commit d8733efc0f
576 changed files with 212486 additions and 191776 deletions

View File

@@ -1,34 +1,34 @@
ifdef BUILD_WITH_ATF
ATF = -framework ATF
USE_ATF = -DUSE_ATF
endif
SRCS = main.cpp wrappers.cpp utils.cpp test_create_context.cpp test_functions_api.cpp test_functions_kernel.cpp test_get_device_ids.cpp test_interop_sync.cpp test_memory_access.cpp test_other_data_types.cpp ../../test_common/harness/errorHelpers.c ../../test_common/harness/testHarness.c ../../test_common/harness/mt19937.c ../../test_common/harness/rounding_mode.c ../../test_common/harness/typeWrappers.cpp ../../test_common/harness/kernelHelpers.c
DEFINES =
SOURCES = $(abspath $(SRCS))
LIBPATH += -L/System/Library/Frameworks/OpenCL.framework/Libraries
LIBPATH += -L.
FRAMEWORK = $(SOURCES)
HEADERS =
TARGET = media_sharing
INCLUDE =
COMPILERFLAGS = -c -Wall -g -Wshorten-64-to-32
CC = g++
CFLAGS = $(COMPILERFLAGS) ${RC_CFLAGS} ${USE_ATF} $(DEFINES:%=-D%) $(INCLUDE)
CXXFLAGS = $(COMPILERFLAGS) ${RC_CFLAGS} ${USE_ATF} $(DEFINES:%=-D%) $(INCLUDE)
LIBRARIES = -framework OpenCL -framework OpenGL -framework GLUT -framework AppKit ${ATF}
OBJECTS := ${SOURCES:.c=.o}
OBJECTS := ${OBJECTS:.cpp=.o}
TARGETOBJECT =
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $(RC_CFLAGS) $(OBJECTS) -o $@ $(LIBPATH) $(LIBRARIES)
clean:
rm -f $(TARGET) $(OBJECTS)
.DEFAULT:
@echo The target \"$@\" does not exist in Makefile.
ifdef BUILD_WITH_ATF
ATF = -framework ATF
USE_ATF = -DUSE_ATF
endif
SRCS = main.cpp wrappers.cpp utils.cpp test_create_context.cpp test_functions_api.cpp test_functions_kernel.cpp test_get_device_ids.cpp test_interop_sync.cpp test_memory_access.cpp test_other_data_types.cpp ../../test_common/harness/errorHelpers.c ../../test_common/harness/testHarness.c ../../test_common/harness/mt19937.c ../../test_common/harness/rounding_mode.c ../../test_common/harness/typeWrappers.cpp ../../test_common/harness/kernelHelpers.c
DEFINES =
SOURCES = $(abspath $(SRCS))
LIBPATH += -L/System/Library/Frameworks/OpenCL.framework/Libraries
LIBPATH += -L.
FRAMEWORK = $(SOURCES)
HEADERS =
TARGET = media_sharing
INCLUDE =
COMPILERFLAGS = -c -Wall -g -Wshorten-64-to-32
CC = g++
CFLAGS = $(COMPILERFLAGS) ${RC_CFLAGS} ${USE_ATF} $(DEFINES:%=-D%) $(INCLUDE)
CXXFLAGS = $(COMPILERFLAGS) ${RC_CFLAGS} ${USE_ATF} $(DEFINES:%=-D%) $(INCLUDE)
LIBRARIES = -framework OpenCL -framework OpenGL -framework GLUT -framework AppKit ${ATF}
OBJECTS := ${SOURCES:.c=.o}
OBJECTS := ${OBJECTS:.cpp=.o}
TARGETOBJECT =
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $(RC_CFLAGS) $(OBJECTS) -o $@ $(LIBPATH) $(LIBRARIES)
clean:
rm -f $(TARGET) $(OBJECTS)
.DEFAULT:
@echo The target \"$@\" does not exist in Makefile.

View File

@@ -1,6 +1,6 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
@@ -13,211 +13,211 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include <stdio.h>
#include <stdlib.h>
#include "../../test_common/harness/testHarness.h"
#include "utils.h"
extern int test_context_create(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_get_device_ids(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_api(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_kernel(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_other_data_types(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_memory_access(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_interop_user_sync(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
basefn basefn_list[] = {
test_context_create,
test_get_device_ids,
test_api,
test_kernel,
test_other_data_types,
test_memory_access,
test_interop_user_sync,
};
const char *basefn_names[] = {
"test_context_create",
"test_get_device_ids",
"test_api",
"test_kernel",
"test_other_data_types",
"test_memory_access",
"test_interop_user_sync",
"all",
};
ct_assert((sizeof(basefn_names) / sizeof(basefn_names[0]) - 1) == (sizeof(basefn_list) / sizeof(basefn_list[0])));
int num_fns = sizeof(basefn_names) / sizeof(char *);
clGetDeviceIDsFromDX9MediaAdapterKHR_fn clGetDeviceIDsFromDX9MediaAdapterKHR = NULL;
clCreateFromDX9MediaSurfaceKHR_fn clCreateFromDX9MediaSurfaceKHR = NULL;
clEnqueueAcquireDX9MediaSurfacesKHR_fn clEnqueueAcquireDX9MediaSurfacesKHR = NULL;
clEnqueueReleaseDX9MediaSurfacesKHR_fn clEnqueueReleaseDX9MediaSurfacesKHR = NULL;
cl_platform_id gPlatformIDdetected;
cl_device_id gDeviceIDdetected;
cl_device_type gDeviceTypeSelected = CL_DEVICE_TYPE_DEFAULT;
bool MediaSurfaceSharingExtensionInit()
{
clGetDeviceIDsFromDX9MediaAdapterKHR = (clGetDeviceIDsFromDX9MediaAdapterKHR_fn)clGetExtensionFunctionAddressForPlatform(gPlatformIDdetected, "clGetDeviceIDsFromDX9MediaAdapterKHR");
if (clGetDeviceIDsFromDX9MediaAdapterKHR == NULL)
{
log_error("clGetExtensionFunctionAddressForPlatform(clGetDeviceIDsFromDX9MediaAdapterKHR) returned NULL.\n");
return false;
}
clCreateFromDX9MediaSurfaceKHR = (clCreateFromDX9MediaSurfaceKHR_fn)clGetExtensionFunctionAddressForPlatform(gPlatformIDdetected, "clCreateFromDX9MediaSurfaceKHR");
if (clCreateFromDX9MediaSurfaceKHR == NULL)
{
log_error("clGetExtensionFunctionAddressForPlatform(clCreateFromDX9MediaSurfaceKHR) returned NULL.\n");
return false;
}
clEnqueueAcquireDX9MediaSurfacesKHR = (clEnqueueAcquireDX9MediaSurfacesKHR_fn)clGetExtensionFunctionAddressForPlatform(gPlatformIDdetected, "clEnqueueAcquireDX9MediaSurfacesKHR");
if (clEnqueueAcquireDX9MediaSurfacesKHR == NULL)
{
log_error("clGetExtensionFunctionAddressForPlatform(clEnqueueAcquireDX9MediaSurfacesKHR) returned NULL.\n");
return false;
}
clEnqueueReleaseDX9MediaSurfacesKHR = (clEnqueueReleaseDX9MediaSurfacesKHR_fn)clGetExtensionFunctionAddressForPlatform(gPlatformIDdetected, "clEnqueueReleaseDX9MediaSurfacesKHR");
if (clEnqueueReleaseDX9MediaSurfacesKHR == NULL)
{
log_error("clGetExtensionFunctionAddressForPlatform(clEnqueueReleaseDX9MediaSurfacesKHR) returned NULL.\n");
return false;
}
return true;
}
bool DetectPlatformAndDevice()
{
std::vector<cl_platform_id> platforms;
cl_uint platformsNum = 0;
cl_int error = clGetPlatformIDs(0, 0, &platformsNum);
if (error != CL_SUCCESS)
{
print_error(error, "clGetPlatformIDs failed\n");
return false;
}
platforms.resize(platformsNum);
error = clGetPlatformIDs(platformsNum, &platforms[0], 0);
if (error != CL_SUCCESS)
{
print_error(error, "clGetPlatformIDs failed\n");
return false;
}
bool found = false;
for (size_t i = 0; i < platformsNum; ++i)
{
std::vector<cl_device_id> devices;
cl_uint devicesNum = 0;
error = clGetDeviceIDs(platforms[i], gDeviceTypeSelected, 0, 0, &devicesNum);
if (error != CL_SUCCESS)
{
print_error(error, "clGetDeviceIDs failed\n");
return false;
}
devices.resize(devicesNum);
error = clGetDeviceIDs(platforms[i], gDeviceTypeSelected, devicesNum, &devices[0], 0);
if (error != CL_SUCCESS)
{
print_error(error, "clGetDeviceIDs failed\n");
return false;
}
for (size_t j = 0; j < devicesNum; ++j)
{
if (ExtensionCheck("cl_khr_dx9_media_sharing", devices[j]))
{
gPlatformIDdetected = platforms[i];
gDeviceIDdetected = devices[j];
found = true;
break;
}
}
}
if (!found)
{
log_info("Test was not run, because the media surface sharing extension is not supported for any devices.\n");
return false;
}
return true;
}
bool CmdlineParse(int argc, const char *argv[])
{
char *env_mode = getenv( "CL_DEVICE_TYPE" );
if( env_mode != NULL )
{
if(strcmp(env_mode, "gpu") == 0 || strcmp(env_mode, "CL_DEVICE_TYPE_GPU") == 0)
gDeviceTypeSelected = CL_DEVICE_TYPE_GPU;
else if(strcmp(env_mode, "cpu") == 0 || strcmp(env_mode, "CL_DEVICE_TYPE_CPU") == 0)
gDeviceTypeSelected = CL_DEVICE_TYPE_CPU;
else if(strcmp(env_mode, "accelerator") == 0 || strcmp(env_mode, "CL_DEVICE_TYPE_ACCELERATOR") == 0)
gDeviceTypeSelected = CL_DEVICE_TYPE_ACCELERATOR;
else if(strcmp(env_mode, "default") == 0 || strcmp(env_mode, "CL_DEVICE_TYPE_DEFAULT") == 0)
gDeviceTypeSelected = CL_DEVICE_TYPE_DEFAULT;
else
{
log_error("Unknown CL_DEVICE_TYPE env variable setting: %s.\nAborting...\n", env_mode);
return false;
}
}
for (int i = 0; i < argc; ++i)
{
if(strcmp(argv[i], "gpu") == 0 || strcmp(argv[i], "CL_DEVICE_TYPE_GPU") == 0)
{
gDeviceTypeSelected = CL_DEVICE_TYPE_GPU;
continue;
}
else if(strcmp( argv[i], "cpu") == 0 || strcmp(argv[i], "CL_DEVICE_TYPE_CPU") == 0)
{
gDeviceTypeSelected = CL_DEVICE_TYPE_CPU;
continue;
}
else if(strcmp( argv[i], "accelerator") == 0 || strcmp(argv[i], "CL_DEVICE_TYPE_ACCELERATOR") == 0)
{
gDeviceTypeSelected = CL_DEVICE_TYPE_ACCELERATOR;
continue;
}
else if(strcmp(argv[i], "CL_DEVICE_TYPE_DEFAULT") == 0)
{
gDeviceTypeSelected = CL_DEVICE_TYPE_DEFAULT;
continue;
}
else if (strcmp(argv[i], "sw") == 0 || strcmp(argv[i], "software") == 0)
{
CDeviceWrapper::AccelerationType(CDeviceWrapper::ACCELERATION_SW);
}
}
return true;
}
int main(int argc, const char *argv[])
{
if (!CmdlineParse(argc, argv))
return 2;
if (!DetectPlatformAndDevice())
{
log_info("Test was not run, because the media surface sharing extension is not supported\n");
return TEST_NOT_SUPPORTED;
}
if (!MediaSurfaceSharingExtensionInit())
return 2;
return runTestHarness( argc, argv, num_fns, basefn_list, basefn_names, false, true, 0 );
}
#include <stdio.h>
#include <stdlib.h>
#include "../../test_common/harness/testHarness.h"
#include "utils.h"
extern int test_context_create(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_get_device_ids(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_api(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_kernel(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_other_data_types(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_memory_access(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_interop_user_sync(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
basefn basefn_list[] = {
test_context_create,
test_get_device_ids,
test_api,
test_kernel,
test_other_data_types,
test_memory_access,
test_interop_user_sync,
};
const char *basefn_names[] = {
"test_context_create",
"test_get_device_ids",
"test_api",
"test_kernel",
"test_other_data_types",
"test_memory_access",
"test_interop_user_sync",
"all",
};
ct_assert((sizeof(basefn_names) / sizeof(basefn_names[0]) - 1) == (sizeof(basefn_list) / sizeof(basefn_list[0])));
int num_fns = sizeof(basefn_names) / sizeof(char *);
clGetDeviceIDsFromDX9MediaAdapterKHR_fn clGetDeviceIDsFromDX9MediaAdapterKHR = NULL;
clCreateFromDX9MediaSurfaceKHR_fn clCreateFromDX9MediaSurfaceKHR = NULL;
clEnqueueAcquireDX9MediaSurfacesKHR_fn clEnqueueAcquireDX9MediaSurfacesKHR = NULL;
clEnqueueReleaseDX9MediaSurfacesKHR_fn clEnqueueReleaseDX9MediaSurfacesKHR = NULL;
cl_platform_id gPlatformIDdetected;
cl_device_id gDeviceIDdetected;
cl_device_type gDeviceTypeSelected = CL_DEVICE_TYPE_DEFAULT;
bool MediaSurfaceSharingExtensionInit()
{
clGetDeviceIDsFromDX9MediaAdapterKHR = (clGetDeviceIDsFromDX9MediaAdapterKHR_fn)clGetExtensionFunctionAddressForPlatform(gPlatformIDdetected, "clGetDeviceIDsFromDX9MediaAdapterKHR");
if (clGetDeviceIDsFromDX9MediaAdapterKHR == NULL)
{
log_error("clGetExtensionFunctionAddressForPlatform(clGetDeviceIDsFromDX9MediaAdapterKHR) returned NULL.\n");
return false;
}
clCreateFromDX9MediaSurfaceKHR = (clCreateFromDX9MediaSurfaceKHR_fn)clGetExtensionFunctionAddressForPlatform(gPlatformIDdetected, "clCreateFromDX9MediaSurfaceKHR");
if (clCreateFromDX9MediaSurfaceKHR == NULL)
{
log_error("clGetExtensionFunctionAddressForPlatform(clCreateFromDX9MediaSurfaceKHR) returned NULL.\n");
return false;
}
clEnqueueAcquireDX9MediaSurfacesKHR = (clEnqueueAcquireDX9MediaSurfacesKHR_fn)clGetExtensionFunctionAddressForPlatform(gPlatformIDdetected, "clEnqueueAcquireDX9MediaSurfacesKHR");
if (clEnqueueAcquireDX9MediaSurfacesKHR == NULL)
{
log_error("clGetExtensionFunctionAddressForPlatform(clEnqueueAcquireDX9MediaSurfacesKHR) returned NULL.\n");
return false;
}
clEnqueueReleaseDX9MediaSurfacesKHR = (clEnqueueReleaseDX9MediaSurfacesKHR_fn)clGetExtensionFunctionAddressForPlatform(gPlatformIDdetected, "clEnqueueReleaseDX9MediaSurfacesKHR");
if (clEnqueueReleaseDX9MediaSurfacesKHR == NULL)
{
log_error("clGetExtensionFunctionAddressForPlatform(clEnqueueReleaseDX9MediaSurfacesKHR) returned NULL.\n");
return false;
}
return true;
}
bool DetectPlatformAndDevice()
{
std::vector<cl_platform_id> platforms;
cl_uint platformsNum = 0;
cl_int error = clGetPlatformIDs(0, 0, &platformsNum);
if (error != CL_SUCCESS)
{
print_error(error, "clGetPlatformIDs failed\n");
return false;
}
platforms.resize(platformsNum);
error = clGetPlatformIDs(platformsNum, &platforms[0], 0);
if (error != CL_SUCCESS)
{
print_error(error, "clGetPlatformIDs failed\n");
return false;
}
bool found = false;
for (size_t i = 0; i < platformsNum; ++i)
{
std::vector<cl_device_id> devices;
cl_uint devicesNum = 0;
error = clGetDeviceIDs(platforms[i], gDeviceTypeSelected, 0, 0, &devicesNum);
if (error != CL_SUCCESS)
{
print_error(error, "clGetDeviceIDs failed\n");
return false;
}
devices.resize(devicesNum);
error = clGetDeviceIDs(platforms[i], gDeviceTypeSelected, devicesNum, &devices[0], 0);
if (error != CL_SUCCESS)
{
print_error(error, "clGetDeviceIDs failed\n");
return false;
}
for (size_t j = 0; j < devicesNum; ++j)
{
if (ExtensionCheck("cl_khr_dx9_media_sharing", devices[j]))
{
gPlatformIDdetected = platforms[i];
gDeviceIDdetected = devices[j];
found = true;
break;
}
}
}
if (!found)
{
log_info("Test was not run, because the media surface sharing extension is not supported for any devices.\n");
return false;
}
return true;
}
bool CmdlineParse(int argc, const char *argv[])
{
char *env_mode = getenv( "CL_DEVICE_TYPE" );
if( env_mode != NULL )
{
if(strcmp(env_mode, "gpu") == 0 || strcmp(env_mode, "CL_DEVICE_TYPE_GPU") == 0)
gDeviceTypeSelected = CL_DEVICE_TYPE_GPU;
else if(strcmp(env_mode, "cpu") == 0 || strcmp(env_mode, "CL_DEVICE_TYPE_CPU") == 0)
gDeviceTypeSelected = CL_DEVICE_TYPE_CPU;
else if(strcmp(env_mode, "accelerator") == 0 || strcmp(env_mode, "CL_DEVICE_TYPE_ACCELERATOR") == 0)
gDeviceTypeSelected = CL_DEVICE_TYPE_ACCELERATOR;
else if(strcmp(env_mode, "default") == 0 || strcmp(env_mode, "CL_DEVICE_TYPE_DEFAULT") == 0)
gDeviceTypeSelected = CL_DEVICE_TYPE_DEFAULT;
else
{
log_error("Unknown CL_DEVICE_TYPE env variable setting: %s.\nAborting...\n", env_mode);
return false;
}
}
for (int i = 0; i < argc; ++i)
{
if(strcmp(argv[i], "gpu") == 0 || strcmp(argv[i], "CL_DEVICE_TYPE_GPU") == 0)
{
gDeviceTypeSelected = CL_DEVICE_TYPE_GPU;
continue;
}
else if(strcmp( argv[i], "cpu") == 0 || strcmp(argv[i], "CL_DEVICE_TYPE_CPU") == 0)
{
gDeviceTypeSelected = CL_DEVICE_TYPE_CPU;
continue;
}
else if(strcmp( argv[i], "accelerator") == 0 || strcmp(argv[i], "CL_DEVICE_TYPE_ACCELERATOR") == 0)
{
gDeviceTypeSelected = CL_DEVICE_TYPE_ACCELERATOR;
continue;
}
else if(strcmp(argv[i], "CL_DEVICE_TYPE_DEFAULT") == 0)
{
gDeviceTypeSelected = CL_DEVICE_TYPE_DEFAULT;
continue;
}
else if (strcmp(argv[i], "sw") == 0 || strcmp(argv[i], "software") == 0)
{
CDeviceWrapper::AccelerationType(CDeviceWrapper::ACCELERATION_SW);
}
}
return true;
}
int main(int argc, const char *argv[])
{
if (!CmdlineParse(argc, argv))
return 2;
if (!DetectPlatformAndDevice())
{
log_info("Test was not run, because the media surface sharing extension is not supported\n");
return TEST_NOT_SUPPORTED;
}
if (!MediaSurfaceSharingExtensionInit())
return 2;
return runTestHarness( argc, argv, num_fns, basefn_list, basefn_names, false, true, 0 );
}

View File

@@ -1,6 +1,6 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
@@ -13,293 +13,293 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include "utils.h"
int context_create(cl_device_id deviceID, cl_context context, cl_command_queue queue,
int num_elements, unsigned int width, unsigned int height,
TContextFuncType functionCreate, cl_dx9_media_adapter_type_khr adapterType,
TSurfaceFormat surfaceFormat, TSharedHandleType sharedHandle)
{
CResult result;
//create device
std::auto_ptr<CDeviceWrapper> deviceWrapper;
if (!DeviceCreate(adapterType, deviceWrapper))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
//generate input data
std::vector<cl_uchar> bufferIn(width * height * 3 / 2, 0);
if(!YUVGenerate(surfaceFormat, bufferIn, width, height, 0, 255))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
while (deviceWrapper->AdapterNext())
{
if (surfaceFormat != SURFACE_FORMAT_NV12 && !SurfaceFormatCheck(adapterType, *deviceWrapper, surfaceFormat))
{
std::string sharedHandleStr = (sharedHandle == SHARED_HANDLE_ENABLED)? "yes": "no";
std::string formatStr;
std::string adapterStr;
SurfaceFormatToString(surfaceFormat, formatStr);
AdapterToString(adapterType, adapterStr);
log_info("Skipping test case, image format is not supported by a device (adapter type: %s, format: %s, shared handle: %s)\n",
adapterStr.c_str(), formatStr.c_str(), sharedHandleStr.c_str());
return result.Result();
}
void *objectSharedHandle = 0;
std::auto_ptr<CSurfaceWrapper> surface;
if (!MediaSurfaceCreate(adapterType, width, height, surfaceFormat, *deviceWrapper, surface,
(sharedHandle == SHARED_HANDLE_ENABLED) ? true: false, &objectSharedHandle))
{
log_error("Media surface creation failed for %i adapter\n", deviceWrapper->AdapterIdx());
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
cl_context_properties contextProperties[] = {
CL_CONTEXT_PLATFORM, (cl_context_properties)gPlatformIDdetected,
AdapterTypeToContextInfo(adapterType), (cl_context_properties)deviceWrapper->Device(),
0,
};
cl_int error;
clContextWrapper ctx;
switch(functionCreate)
{
case CONTEXT_CREATE_DEFAULT:
ctx = clCreateContext(&contextProperties[0], 1, &gDeviceIDdetected, NULL, NULL, &error);
break;
case CONTEXT_CREATE_FROM_TYPE:
ctx = clCreateContextFromType(&contextProperties[0], gDeviceTypeSelected, NULL, NULL, &error);
break;
default:
log_error("Unknown context creation function enum\n");
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
break;
}
if (error != CL_SUCCESS)
{
std::string functionName;
FunctionContextCreateToString(functionCreate, functionName);
log_error("%s failed: %s\n", functionName.c_str(), IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVSurfaceSet(surfaceFormat, surface, bufferIn, width, height))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
#if defined(_WIN32)
cl_dx9_surface_info_khr surfaceInfo;
surfaceInfo.resource = *(static_cast<CD3D9SurfaceWrapper *>(surface.get()));
surfaceInfo.shared_handle = objectSharedHandle;
#else
void *surfaceInfo = 0;
return TEST_NOT_IMPLEMENTED;
#endif
std::vector<cl_mem> memObjList;
unsigned int planesNum = PlanesNum(surfaceFormat);
std::vector<clMemWrapper> planesList(planesNum);
for (unsigned int planeIdx = 0; planeIdx < planesNum; ++planeIdx)
{
planesList[planeIdx] = clCreateFromDX9MediaSurfaceKHR(ctx, CL_MEM_READ_WRITE, adapterType, &surfaceInfo, planeIdx, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateFromDX9MediaSurfaceKHR failed for plane %i: %s\n", planeIdx, IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
memObjList.push_back(planesList[planeIdx]);
}
clCommandQueueWrapper cmdQueue = clCreateCommandQueue(ctx, gDeviceIDdetected, 0, &error );
if (error != CL_SUCCESS)
{
log_error("Unable to create command queue: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!ImageInfoVerify(adapterType, memObjList, width, height, surface, objectSharedHandle))
{
log_error("Image info verification failed\n");
result.ResultSub(CResult::TEST_FAIL);
}
cl_event event;
error = clEnqueueAcquireDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()),
&memObjList.at(0), 0, NULL, &event);
if (error != CL_SUCCESS)
{
log_error("clEnqueueAcquireDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
cl_uint eventType = 0;
error = clGetEventInfo( event, CL_EVENT_COMMAND_TYPE, sizeof(eventType), &eventType, NULL);
if (error != CL_SUCCESS)
{
log_error("clGetEventInfo failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
if(eventType != CL_COMMAND_ACQUIRE_DX9_MEDIA_SURFACES_KHR)
{
log_error("Invalid event != CL_COMMAND_ACQUIRE_DX9_MEDIA_SURFACES_KHR\n");
result.ResultSub(CResult::TEST_FAIL);
}
clReleaseEvent(event);
size_t origin[3] = {0,0,0};
size_t offset = 0;
size_t frameSize = width * height * 3 / 2;
std::vector<cl_uchar> out( frameSize, 0 );
for (size_t i = 0; i < memObjList.size(); ++i)
{
size_t planeWidth = (i == 0) ? width: width / 2;
size_t planeHeight = (i == 0) ? height: height / 2;
size_t regionPlane[3] = {planeWidth, planeHeight, 1};
error = clEnqueueReadImage(cmdQueue, memObjList.at(i), CL_TRUE, origin, regionPlane, 0, 0, &out.at(offset), 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReadImage failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
offset += planeWidth * planeHeight;
}
if (!YUVCompare(surfaceFormat, out, bufferIn, width, height))
{
log_error("OCL object verification failed - clEnqueueReadImage\n");
result.ResultSub(CResult::TEST_FAIL);
}
error = clEnqueueReleaseDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()),
&memObjList.at(0), 0, NULL, &event);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReleaseDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
eventType = 0;
error = clGetEventInfo( event, CL_EVENT_COMMAND_TYPE, sizeof(eventType), &eventType, NULL);
if (error != CL_SUCCESS)
{
log_error("clGetEventInfo failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
if(eventType != CL_COMMAND_RELEASE_DX9_MEDIA_SURFACES_KHR)
{
log_error("Invalid event != CL_COMMAND_RELEASE_DX9_MEDIA_SURFACES_KHR\n");
result.ResultSub(CResult::TEST_FAIL);
}
clReleaseEvent(event);
//object verification
std::vector<cl_uchar> bufferOut(frameSize, 0);
if (!YUVSurfaceGet(surfaceFormat, surface, bufferOut, width, height))
{
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVCompare(surfaceFormat, bufferOut, bufferIn, width, height))
{
log_error("Media surface is different than expected\n");
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
}
if (!deviceWrapper->Status())
{
std::string adapterName;
AdapterToString(adapterType, adapterName);
log_error("%s init failed\n", adapterName.c_str());
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
return result.Result();
}
int test_context_create(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
{
const unsigned int WIDTH = 256;
const unsigned int HEIGHT = 256;
std::vector<cl_dx9_media_adapter_type_khr> adapterTypes;
#if defined(_WIN32)
adapterTypes.push_back(CL_ADAPTER_D3D9_KHR);
adapterTypes.push_back(CL_ADAPTER_D3D9EX_KHR);
adapterTypes.push_back(CL_ADAPTER_DXVA_KHR);
#endif
std::vector<TContextFuncType> contextFuncs;
contextFuncs.push_back(CONTEXT_CREATE_DEFAULT);
contextFuncs.push_back(CONTEXT_CREATE_FROM_TYPE);
std::vector<TSurfaceFormat> formats;
formats.push_back(SURFACE_FORMAT_NV12);
formats.push_back(SURFACE_FORMAT_YV12);
std::vector<TSharedHandleType> sharedHandleTypes;
sharedHandleTypes.push_back(SHARED_HANDLE_DISABLED);
#if defined(_WIN32)
sharedHandleTypes.push_back(SHARED_HANDLE_ENABLED);
#endif
CResult result;
for (size_t adapterTypeIdx = 0; adapterTypeIdx < adapterTypes.size(); ++adapterTypeIdx)
{
//iteration through all create context functions
for (size_t contextFuncIdx = 0; contextFuncIdx < contextFuncs.size(); ++contextFuncIdx)
{
//iteration through surface formats
for (size_t formatIdx = 0; formatIdx < formats.size(); ++formatIdx)
{
//shared handle enabled or disabled
for (size_t sharedHandleIdx = 0; sharedHandleIdx < sharedHandleTypes.size(); ++sharedHandleIdx)
{
if (adapterTypes[adapterTypeIdx] == CL_ADAPTER_D3D9_KHR && sharedHandleTypes[sharedHandleIdx] == SHARED_HANDLE_ENABLED)
continue;
if(context_create(deviceID, context, queue, num_elements, WIDTH, HEIGHT,
contextFuncs[contextFuncIdx], adapterTypes[adapterTypeIdx], formats[formatIdx],
sharedHandleTypes[sharedHandleIdx]) != 0)
{
std::string sharedHandle = (sharedHandleTypes[sharedHandleIdx] == SHARED_HANDLE_ENABLED)? "shared handle": "no shared handle";
std::string formatStr;
std::string adapterTypeStr;
SurfaceFormatToString(formats[formatIdx], formatStr);
AdapterToString(adapterTypes[adapterTypeIdx], adapterTypeStr);
log_error("\nTest case - clCreateContext (%s, %s, %s) failed\n\n", adapterTypeStr.c_str(), formatStr.c_str(), sharedHandle.c_str());
result.ResultSub(CResult::TEST_FAIL);
}
}
}
}
}
return result.Result();
}
#include "utils.h"
int context_create(cl_device_id deviceID, cl_context context, cl_command_queue queue,
int num_elements, unsigned int width, unsigned int height,
TContextFuncType functionCreate, cl_dx9_media_adapter_type_khr adapterType,
TSurfaceFormat surfaceFormat, TSharedHandleType sharedHandle)
{
CResult result;
//create device
std::auto_ptr<CDeviceWrapper> deviceWrapper;
if (!DeviceCreate(adapterType, deviceWrapper))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
//generate input data
std::vector<cl_uchar> bufferIn(width * height * 3 / 2, 0);
if(!YUVGenerate(surfaceFormat, bufferIn, width, height, 0, 255))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
while (deviceWrapper->AdapterNext())
{
if (surfaceFormat != SURFACE_FORMAT_NV12 && !SurfaceFormatCheck(adapterType, *deviceWrapper, surfaceFormat))
{
std::string sharedHandleStr = (sharedHandle == SHARED_HANDLE_ENABLED)? "yes": "no";
std::string formatStr;
std::string adapterStr;
SurfaceFormatToString(surfaceFormat, formatStr);
AdapterToString(adapterType, adapterStr);
log_info("Skipping test case, image format is not supported by a device (adapter type: %s, format: %s, shared handle: %s)\n",
adapterStr.c_str(), formatStr.c_str(), sharedHandleStr.c_str());
return result.Result();
}
void *objectSharedHandle = 0;
std::auto_ptr<CSurfaceWrapper> surface;
if (!MediaSurfaceCreate(adapterType, width, height, surfaceFormat, *deviceWrapper, surface,
(sharedHandle == SHARED_HANDLE_ENABLED) ? true: false, &objectSharedHandle))
{
log_error("Media surface creation failed for %i adapter\n", deviceWrapper->AdapterIdx());
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
cl_context_properties contextProperties[] = {
CL_CONTEXT_PLATFORM, (cl_context_properties)gPlatformIDdetected,
AdapterTypeToContextInfo(adapterType), (cl_context_properties)deviceWrapper->Device(),
0,
};
cl_int error;
clContextWrapper ctx;
switch(functionCreate)
{
case CONTEXT_CREATE_DEFAULT:
ctx = clCreateContext(&contextProperties[0], 1, &gDeviceIDdetected, NULL, NULL, &error);
break;
case CONTEXT_CREATE_FROM_TYPE:
ctx = clCreateContextFromType(&contextProperties[0], gDeviceTypeSelected, NULL, NULL, &error);
break;
default:
log_error("Unknown context creation function enum\n");
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
break;
}
if (error != CL_SUCCESS)
{
std::string functionName;
FunctionContextCreateToString(functionCreate, functionName);
log_error("%s failed: %s\n", functionName.c_str(), IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVSurfaceSet(surfaceFormat, surface, bufferIn, width, height))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
#if defined(_WIN32)
cl_dx9_surface_info_khr surfaceInfo;
surfaceInfo.resource = *(static_cast<CD3D9SurfaceWrapper *>(surface.get()));
surfaceInfo.shared_handle = objectSharedHandle;
#else
void *surfaceInfo = 0;
return TEST_NOT_IMPLEMENTED;
#endif
std::vector<cl_mem> memObjList;
unsigned int planesNum = PlanesNum(surfaceFormat);
std::vector<clMemWrapper> planesList(planesNum);
for (unsigned int planeIdx = 0; planeIdx < planesNum; ++planeIdx)
{
planesList[planeIdx] = clCreateFromDX9MediaSurfaceKHR(ctx, CL_MEM_READ_WRITE, adapterType, &surfaceInfo, planeIdx, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateFromDX9MediaSurfaceKHR failed for plane %i: %s\n", planeIdx, IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
memObjList.push_back(planesList[planeIdx]);
}
clCommandQueueWrapper cmdQueue = clCreateCommandQueue(ctx, gDeviceIDdetected, 0, &error );
if (error != CL_SUCCESS)
{
log_error("Unable to create command queue: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!ImageInfoVerify(adapterType, memObjList, width, height, surface, objectSharedHandle))
{
log_error("Image info verification failed\n");
result.ResultSub(CResult::TEST_FAIL);
}
cl_event event;
error = clEnqueueAcquireDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()),
&memObjList.at(0), 0, NULL, &event);
if (error != CL_SUCCESS)
{
log_error("clEnqueueAcquireDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
cl_uint eventType = 0;
error = clGetEventInfo( event, CL_EVENT_COMMAND_TYPE, sizeof(eventType), &eventType, NULL);
if (error != CL_SUCCESS)
{
log_error("clGetEventInfo failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
if(eventType != CL_COMMAND_ACQUIRE_DX9_MEDIA_SURFACES_KHR)
{
log_error("Invalid event != CL_COMMAND_ACQUIRE_DX9_MEDIA_SURFACES_KHR\n");
result.ResultSub(CResult::TEST_FAIL);
}
clReleaseEvent(event);
size_t origin[3] = {0,0,0};
size_t offset = 0;
size_t frameSize = width * height * 3 / 2;
std::vector<cl_uchar> out( frameSize, 0 );
for (size_t i = 0; i < memObjList.size(); ++i)
{
size_t planeWidth = (i == 0) ? width: width / 2;
size_t planeHeight = (i == 0) ? height: height / 2;
size_t regionPlane[3] = {planeWidth, planeHeight, 1};
error = clEnqueueReadImage(cmdQueue, memObjList.at(i), CL_TRUE, origin, regionPlane, 0, 0, &out.at(offset), 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReadImage failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
offset += planeWidth * planeHeight;
}
if (!YUVCompare(surfaceFormat, out, bufferIn, width, height))
{
log_error("OCL object verification failed - clEnqueueReadImage\n");
result.ResultSub(CResult::TEST_FAIL);
}
error = clEnqueueReleaseDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()),
&memObjList.at(0), 0, NULL, &event);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReleaseDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
eventType = 0;
error = clGetEventInfo( event, CL_EVENT_COMMAND_TYPE, sizeof(eventType), &eventType, NULL);
if (error != CL_SUCCESS)
{
log_error("clGetEventInfo failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
if(eventType != CL_COMMAND_RELEASE_DX9_MEDIA_SURFACES_KHR)
{
log_error("Invalid event != CL_COMMAND_RELEASE_DX9_MEDIA_SURFACES_KHR\n");
result.ResultSub(CResult::TEST_FAIL);
}
clReleaseEvent(event);
//object verification
std::vector<cl_uchar> bufferOut(frameSize, 0);
if (!YUVSurfaceGet(surfaceFormat, surface, bufferOut, width, height))
{
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVCompare(surfaceFormat, bufferOut, bufferIn, width, height))
{
log_error("Media surface is different than expected\n");
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
}
if (!deviceWrapper->Status())
{
std::string adapterName;
AdapterToString(adapterType, adapterName);
log_error("%s init failed\n", adapterName.c_str());
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
return result.Result();
}
int test_context_create(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
{
const unsigned int WIDTH = 256;
const unsigned int HEIGHT = 256;
std::vector<cl_dx9_media_adapter_type_khr> adapterTypes;
#if defined(_WIN32)
adapterTypes.push_back(CL_ADAPTER_D3D9_KHR);
adapterTypes.push_back(CL_ADAPTER_D3D9EX_KHR);
adapterTypes.push_back(CL_ADAPTER_DXVA_KHR);
#endif
std::vector<TContextFuncType> contextFuncs;
contextFuncs.push_back(CONTEXT_CREATE_DEFAULT);
contextFuncs.push_back(CONTEXT_CREATE_FROM_TYPE);
std::vector<TSurfaceFormat> formats;
formats.push_back(SURFACE_FORMAT_NV12);
formats.push_back(SURFACE_FORMAT_YV12);
std::vector<TSharedHandleType> sharedHandleTypes;
sharedHandleTypes.push_back(SHARED_HANDLE_DISABLED);
#if defined(_WIN32)
sharedHandleTypes.push_back(SHARED_HANDLE_ENABLED);
#endif
CResult result;
for (size_t adapterTypeIdx = 0; adapterTypeIdx < adapterTypes.size(); ++adapterTypeIdx)
{
//iteration through all create context functions
for (size_t contextFuncIdx = 0; contextFuncIdx < contextFuncs.size(); ++contextFuncIdx)
{
//iteration through surface formats
for (size_t formatIdx = 0; formatIdx < formats.size(); ++formatIdx)
{
//shared handle enabled or disabled
for (size_t sharedHandleIdx = 0; sharedHandleIdx < sharedHandleTypes.size(); ++sharedHandleIdx)
{
if (adapterTypes[adapterTypeIdx] == CL_ADAPTER_D3D9_KHR && sharedHandleTypes[sharedHandleIdx] == SHARED_HANDLE_ENABLED)
continue;
if(context_create(deviceID, context, queue, num_elements, WIDTH, HEIGHT,
contextFuncs[contextFuncIdx], adapterTypes[adapterTypeIdx], formats[formatIdx],
sharedHandleTypes[sharedHandleIdx]) != 0)
{
std::string sharedHandle = (sharedHandleTypes[sharedHandleIdx] == SHARED_HANDLE_ENABLED)? "shared handle": "no shared handle";
std::string formatStr;
std::string adapterTypeStr;
SurfaceFormatToString(formats[formatIdx], formatStr);
AdapterToString(adapterTypes[adapterTypeIdx], adapterTypeStr);
log_error("\nTest case - clCreateContext (%s, %s, %s) failed\n\n", adapterTypeStr.c_str(), formatStr.c_str(), sharedHandle.c_str());
result.ResultSub(CResult::TEST_FAIL);
}
}
}
}
}
return result.Result();
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
@@ -13,421 +13,421 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include <stdio.h>
#include <stdlib.h>
#include "../../test_common/harness/errorHelpers.h"
#include "../../test_common/harness/kernelHelpers.h"
#include "utils.h"
int kernel_functions(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements,
unsigned int iterationNum, unsigned int width, unsigned int height, cl_dx9_media_adapter_type_khr adapterType,
TSurfaceFormat surfaceFormat, TSharedHandleType sharedHandle)
{
const unsigned int FRAME_NUM = 2;
const cl_uchar MAX_VALUE = 255 / 2;
const std::string PROGRAM_STR =
"__kernel void TestFunction( read_only image2d_t planeIn, write_only image2d_t planeOut, "
NL " sampler_t sampler, __global int *planeRes)"
NL "{"
NL " int w = get_global_id(0);"
NL " int h = get_global_id(1);"
NL " int width = get_image_width(planeIn);"
NL " int height = get_image_height(planeOut);"
NL " float4 color0 = read_imagef(planeIn, sampler, (int2)(w,h)) + 0.2f;"
NL " float4 color1 = read_imagef(planeIn, sampler, (float2)(w,h)) + 0.2f;"
NL " color0 = (color0 == color1) ? color0: (float4)(0.5, 0.5, 0.5, 0.5);"
NL " write_imagef(planeOut, (int2)(w,h), color0);"
NL " if(w == 0 && h == 0)"
NL " {"
NL " planeRes[0] = width;"
NL " planeRes[1] = height;"
NL " }"
NL "}";
CResult result;
std::auto_ptr<CDeviceWrapper> deviceWrapper;
if (!DeviceCreate(adapterType, deviceWrapper))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
std::vector<std::vector<cl_uchar> > bufferIn(FRAME_NUM);
std::vector<std::vector<cl_uchar> > bufferExp(FRAME_NUM);
size_t frameSize = width * height * 3 / 2;
cl_uchar step = MAX_VALUE / FRAME_NUM;
for (size_t i = 0; i < FRAME_NUM; ++i)
{
if (!YUVGenerate(surfaceFormat, bufferIn[i], width, height, static_cast<cl_uchar>(step * i), static_cast<cl_uchar>(step * (i + 1))) ||
!YUVGenerate(surfaceFormat, bufferExp[i], width, height, static_cast<cl_uchar>(step * i), static_cast<cl_uchar>(step * (i + 1)), 0.2))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
}
while (deviceWrapper->AdapterNext())
{
if (surfaceFormat != SURFACE_FORMAT_NV12 && !SurfaceFormatCheck(adapterType, *deviceWrapper, surfaceFormat))
{
std::string sharedHandleStr = (sharedHandle == SHARED_HANDLE_ENABLED)? "yes": "no";
std::string formatStr;
std::string adapterStr;
SurfaceFormatToString(surfaceFormat, formatStr);
AdapterToString(adapterType, adapterStr);
log_info("Skipping test case, image format is not supported by a device (adapter type: %s, format: %s, shared handle: %s)\n",
adapterStr.c_str(), formatStr.c_str(), sharedHandleStr.c_str());
return result.Result();
}
void *objectSrcHandle = 0;
std::auto_ptr<CSurfaceWrapper> surfaceSrc;
if (!MediaSurfaceCreate(adapterType, width, height, surfaceFormat, *deviceWrapper, surfaceSrc,
(sharedHandle == SHARED_HANDLE_ENABLED) ? true: false, &objectSrcHandle))
{
log_error("Media surface creation failed for %i adapter\n", deviceWrapper->AdapterIdx());
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
void *objectDstHandle = 0;
std::auto_ptr<CSurfaceWrapper> surfaceDst;
if (!MediaSurfaceCreate(adapterType, width, height, surfaceFormat, *deviceWrapper, surfaceDst,
(sharedHandle == SHARED_HANDLE_ENABLED) ? true: false, &objectDstHandle))
{
log_error("Media surface creation failed for %i adapter\n", deviceWrapper->AdapterIdx());
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
cl_context_properties contextProperties[] = {
CL_CONTEXT_PLATFORM, (cl_context_properties)gPlatformIDdetected,
AdapterTypeToContextInfo(adapterType), (cl_context_properties)deviceWrapper->Device(),
0,
};
cl_int error;
clContextWrapper ctx = clCreateContext(&contextProperties[0], 1, &gDeviceIDdetected, NULL, NULL, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateContext failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
#if defined(_WIN32)
cl_dx9_surface_info_khr surfaceInfoSrc;
surfaceInfoSrc.resource = *(static_cast<CD3D9SurfaceWrapper *>(surfaceSrc.get()));
surfaceInfoSrc.shared_handle = objectSrcHandle;
cl_dx9_surface_info_khr surfaceInfoDst;
surfaceInfoDst.resource = *(static_cast<CD3D9SurfaceWrapper *>(surfaceDst.get()));
surfaceInfoDst.shared_handle = objectDstHandle;
#else
void *surfaceInfoSrc = 0;
void *surfaceInfoDst = 0;
return TEST_NOT_IMPLEMENTED;
#endif
std::vector<cl_mem> memObjSrcList;
std::vector<cl_mem> memObjDstList;
unsigned int planesNum = PlanesNum(surfaceFormat);
std::vector<clMemWrapper> planeSrcList(planesNum);
std::vector<clMemWrapper> planeDstList(planesNum);
for (unsigned int planeIdx = 0; planeIdx < planesNum; ++planeIdx)
{
planeSrcList[planeIdx] = clCreateFromDX9MediaSurfaceKHR(ctx, CL_MEM_READ_WRITE, adapterType, &surfaceInfoSrc, planeIdx, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateFromDX9MediaSurfaceKHR failed for plane %i: %s\n", planeIdx, IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
memObjSrcList.push_back(planeSrcList[planeIdx]);
planeDstList[planeIdx] = clCreateFromDX9MediaSurfaceKHR(ctx, CL_MEM_READ_WRITE, adapterType, &surfaceInfoDst, planeIdx, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateFromDX9MediaSurfaceKHR failed for plane %i: %s\n", planeIdx, IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
memObjDstList.push_back(planeDstList[planeIdx]);
}
clCommandQueueWrapper cmdQueue = clCreateCommandQueue(ctx, gDeviceIDdetected, 0, &error );
if (error != CL_SUCCESS)
{
log_error("Unable to create command queue: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!ImageInfoVerify(adapterType, memObjSrcList, width, height, surfaceSrc, objectSrcHandle))
{
log_error("Image info verification failed\n");
result.ResultSub(CResult::TEST_FAIL);
}
for (size_t frameIdx = 0; frameIdx < iterationNum; ++frameIdx)
{
if (!YUVSurfaceSet(surfaceFormat, surfaceSrc, bufferIn[frameIdx % FRAME_NUM], width, height))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
error = clEnqueueAcquireDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjSrcList.size()), &memObjSrcList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueAcquireDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
error = clEnqueueAcquireDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjDstList.size()), &memObjDstList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueAcquireDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
clSamplerWrapper sampler = clCreateSampler( ctx, CL_FALSE, CL_ADDRESS_NONE, CL_FILTER_NEAREST, &error );
if(error != CL_SUCCESS)
{
log_error("Unable to create sampler\n");
result.ResultSub(CResult::TEST_FAIL);
}
clProgramWrapper program;
clKernelWrapper kernel;
const char *progPtr = PROGRAM_STR.c_str();
if(create_single_kernel_helper(ctx, &program, &kernel, 1, (const char **)&progPtr, "TestFunction"))
result.ResultSub(CResult::TEST_FAIL);
size_t bufferSize = sizeof(cl_int) * 2;
clMemWrapper imageRes = clCreateBuffer( ctx, CL_MEM_READ_WRITE, bufferSize, NULL, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateBuffer failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
size_t offset = 0;
size_t origin[3] = {0,0,0};
std::vector<cl_uchar> out( frameSize, 0 );
for (size_t i = 0; i < memObjSrcList.size(); ++i)
{
size_t planeWidth = (i == 0) ? width: width / 2;
size_t planeHeight = (i == 0) ? height: height / 2;
size_t regionPlane[3] = {planeWidth, planeHeight, 1};
size_t threads[ 2 ] = { width, height };
error = clSetKernelArg( kernel, 0, sizeof( memObjSrcList[i] ), &memObjSrcList[i] );
if (error != CL_SUCCESS)
{
log_error("Unable to set kernel arguments" );
result.ResultSub(CResult::TEST_FAIL);
}
error = clSetKernelArg( kernel, 1, sizeof( memObjDstList[i] ), &memObjDstList[i] );
if (error != CL_SUCCESS)
{
log_error("Unable to set kernel arguments" );
result.ResultSub(CResult::TEST_FAIL);
}
error = clSetKernelArg( kernel, 2, sizeof( sampler ), &sampler );
if (error != CL_SUCCESS)
{
log_error("Unable to set kernel arguments" );
result.ResultSub(CResult::TEST_FAIL);
}
error = clSetKernelArg( kernel, 3, sizeof( imageRes ), &imageRes );
if (error != CL_SUCCESS)
{
log_error("Unable to set kernel arguments" );
result.ResultSub(CResult::TEST_FAIL);
}
size_t localThreads[ 2 ];
error = get_max_common_2D_work_group_size( ctx, kernel, threads, localThreads );
if (error != CL_SUCCESS)
{
log_error("Unable to get work group size to use" );
result.ResultSub(CResult::TEST_FAIL);
}
error = clEnqueueNDRangeKernel( cmdQueue, kernel, 2, NULL, threads, localThreads, 0, NULL, NULL );
if (error != CL_SUCCESS)
{
log_error("Unable to execute test kernel" );
result.ResultSub(CResult::TEST_FAIL);
}
std::vector<cl_uint> imageResOut(2, 0);
error = clEnqueueReadBuffer( cmdQueue, imageRes, CL_TRUE, 0, bufferSize, &imageResOut[0], 0, NULL, NULL );
if (error != CL_SUCCESS)
{
log_error("Unable to read buffer");
result.ResultSub(CResult::TEST_FAIL);
}
if(imageResOut[0] != planeWidth)
{
log_error("Invalid width value, test = %i, expected = %i\n", imageResOut[0], planeWidth);
result.ResultSub(CResult::TEST_FAIL);
}
if(imageResOut[1] != planeHeight)
{
log_error("Invalid height value, test = %i, expected = %i\n", imageResOut[1], planeHeight);
result.ResultSub(CResult::TEST_FAIL);
}
error = clEnqueueReadImage(cmdQueue, memObjDstList[i], CL_TRUE, origin, regionPlane, 0, 0, &out[offset], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReadImage failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
offset += planeWidth * planeHeight;
}
if (!YUVCompare(surfaceFormat, out, bufferExp[frameIdx % FRAME_NUM], width, height))
{
log_error("Frame idx: %i, OCL objects are different than expected\n", frameIdx);
result.ResultSub(CResult::TEST_FAIL);
}
error = clEnqueueReleaseDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjSrcList.size()), &memObjSrcList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReleaseDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
error = clEnqueueReleaseDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjDstList.size()), &memObjDstList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReleaseDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
std::vector<cl_uchar> bufferOut(frameSize, 0);
if (!YUVSurfaceGet(surfaceFormat, surfaceDst, bufferOut, width, height))
{
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVCompare(surfaceFormat, bufferOut, bufferExp[frameIdx % FRAME_NUM], width, height))
{
log_error("Frame idx: %i, media surface is different than expected\n", frameIdx);
result.ResultSub(CResult::TEST_FAIL);
}
}
}
if (!deviceWrapper->Status())
{
std::string adapter;
AdapterToString(adapterType, adapter);
log_error("%s init failed\n", adapter.c_str());
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
return result.Result();
}
int test_kernel(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
{
CResult result;
#if defined(_WIN32)
//D3D9
if(kernel_functions(deviceID, context, queue, num_elements, 10, 256, 256, CL_ADAPTER_D3D9_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9, NV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(kernel_functions(deviceID, context, queue, num_elements, 3, 256, 256, CL_ADAPTER_D3D9_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9, YV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
//D3D9EX
if(kernel_functions(deviceID, context, queue, num_elements, 5, 256, 512, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9EX, NV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(kernel_functions(deviceID, context, queue, num_elements, 7, 512, 256, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (D3D9EX, NV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(kernel_functions(deviceID, context, queue, num_elements, 10, 256, 256, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9EX, YV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(kernel_functions(deviceID, context, queue, num_elements, 15, 128, 128, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (D3D9EX, YV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
//DXVA
if(kernel_functions(deviceID, context, queue, num_elements, 20, 128, 128, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (DXVA, NV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(kernel_functions(deviceID, context, queue, num_elements, 40, 64, 64, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (DXVA, NV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(kernel_functions(deviceID, context, queue, num_elements, 5, 512, 512, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (DXVA, YV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(kernel_functions(deviceID, context, queue, num_elements, 2, 1024, 1024, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (DXVA, YV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
#else
return TEST_NOT_IMPLEMENTED;
#endif
return result.Result();
#include <stdio.h>
#include <stdlib.h>
#include "../../test_common/harness/errorHelpers.h"
#include "../../test_common/harness/kernelHelpers.h"
#include "utils.h"
int kernel_functions(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements,
unsigned int iterationNum, unsigned int width, unsigned int height, cl_dx9_media_adapter_type_khr adapterType,
TSurfaceFormat surfaceFormat, TSharedHandleType sharedHandle)
{
const unsigned int FRAME_NUM = 2;
const cl_uchar MAX_VALUE = 255 / 2;
const std::string PROGRAM_STR =
"__kernel void TestFunction( read_only image2d_t planeIn, write_only image2d_t planeOut, "
NL " sampler_t sampler, __global int *planeRes)"
NL "{"
NL " int w = get_global_id(0);"
NL " int h = get_global_id(1);"
NL " int width = get_image_width(planeIn);"
NL " int height = get_image_height(planeOut);"
NL " float4 color0 = read_imagef(planeIn, sampler, (int2)(w,h)) + 0.2f;"
NL " float4 color1 = read_imagef(planeIn, sampler, (float2)(w,h)) + 0.2f;"
NL " color0 = (color0 == color1) ? color0: (float4)(0.5, 0.5, 0.5, 0.5);"
NL " write_imagef(planeOut, (int2)(w,h), color0);"
NL " if(w == 0 && h == 0)"
NL " {"
NL " planeRes[0] = width;"
NL " planeRes[1] = height;"
NL " }"
NL "}";
CResult result;
std::auto_ptr<CDeviceWrapper> deviceWrapper;
if (!DeviceCreate(adapterType, deviceWrapper))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
std::vector<std::vector<cl_uchar> > bufferIn(FRAME_NUM);
std::vector<std::vector<cl_uchar> > bufferExp(FRAME_NUM);
size_t frameSize = width * height * 3 / 2;
cl_uchar step = MAX_VALUE / FRAME_NUM;
for (size_t i = 0; i < FRAME_NUM; ++i)
{
if (!YUVGenerate(surfaceFormat, bufferIn[i], width, height, static_cast<cl_uchar>(step * i), static_cast<cl_uchar>(step * (i + 1))) ||
!YUVGenerate(surfaceFormat, bufferExp[i], width, height, static_cast<cl_uchar>(step * i), static_cast<cl_uchar>(step * (i + 1)), 0.2))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
}
while (deviceWrapper->AdapterNext())
{
if (surfaceFormat != SURFACE_FORMAT_NV12 && !SurfaceFormatCheck(adapterType, *deviceWrapper, surfaceFormat))
{
std::string sharedHandleStr = (sharedHandle == SHARED_HANDLE_ENABLED)? "yes": "no";
std::string formatStr;
std::string adapterStr;
SurfaceFormatToString(surfaceFormat, formatStr);
AdapterToString(adapterType, adapterStr);
log_info("Skipping test case, image format is not supported by a device (adapter type: %s, format: %s, shared handle: %s)\n",
adapterStr.c_str(), formatStr.c_str(), sharedHandleStr.c_str());
return result.Result();
}
void *objectSrcHandle = 0;
std::auto_ptr<CSurfaceWrapper> surfaceSrc;
if (!MediaSurfaceCreate(adapterType, width, height, surfaceFormat, *deviceWrapper, surfaceSrc,
(sharedHandle == SHARED_HANDLE_ENABLED) ? true: false, &objectSrcHandle))
{
log_error("Media surface creation failed for %i adapter\n", deviceWrapper->AdapterIdx());
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
void *objectDstHandle = 0;
std::auto_ptr<CSurfaceWrapper> surfaceDst;
if (!MediaSurfaceCreate(adapterType, width, height, surfaceFormat, *deviceWrapper, surfaceDst,
(sharedHandle == SHARED_HANDLE_ENABLED) ? true: false, &objectDstHandle))
{
log_error("Media surface creation failed for %i adapter\n", deviceWrapper->AdapterIdx());
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
cl_context_properties contextProperties[] = {
CL_CONTEXT_PLATFORM, (cl_context_properties)gPlatformIDdetected,
AdapterTypeToContextInfo(adapterType), (cl_context_properties)deviceWrapper->Device(),
0,
};
cl_int error;
clContextWrapper ctx = clCreateContext(&contextProperties[0], 1, &gDeviceIDdetected, NULL, NULL, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateContext failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
#if defined(_WIN32)
cl_dx9_surface_info_khr surfaceInfoSrc;
surfaceInfoSrc.resource = *(static_cast<CD3D9SurfaceWrapper *>(surfaceSrc.get()));
surfaceInfoSrc.shared_handle = objectSrcHandle;
cl_dx9_surface_info_khr surfaceInfoDst;
surfaceInfoDst.resource = *(static_cast<CD3D9SurfaceWrapper *>(surfaceDst.get()));
surfaceInfoDst.shared_handle = objectDstHandle;
#else
void *surfaceInfoSrc = 0;
void *surfaceInfoDst = 0;
return TEST_NOT_IMPLEMENTED;
#endif
std::vector<cl_mem> memObjSrcList;
std::vector<cl_mem> memObjDstList;
unsigned int planesNum = PlanesNum(surfaceFormat);
std::vector<clMemWrapper> planeSrcList(planesNum);
std::vector<clMemWrapper> planeDstList(planesNum);
for (unsigned int planeIdx = 0; planeIdx < planesNum; ++planeIdx)
{
planeSrcList[planeIdx] = clCreateFromDX9MediaSurfaceKHR(ctx, CL_MEM_READ_WRITE, adapterType, &surfaceInfoSrc, planeIdx, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateFromDX9MediaSurfaceKHR failed for plane %i: %s\n", planeIdx, IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
memObjSrcList.push_back(planeSrcList[planeIdx]);
planeDstList[planeIdx] = clCreateFromDX9MediaSurfaceKHR(ctx, CL_MEM_READ_WRITE, adapterType, &surfaceInfoDst, planeIdx, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateFromDX9MediaSurfaceKHR failed for plane %i: %s\n", planeIdx, IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
memObjDstList.push_back(planeDstList[planeIdx]);
}
clCommandQueueWrapper cmdQueue = clCreateCommandQueue(ctx, gDeviceIDdetected, 0, &error );
if (error != CL_SUCCESS)
{
log_error("Unable to create command queue: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!ImageInfoVerify(adapterType, memObjSrcList, width, height, surfaceSrc, objectSrcHandle))
{
log_error("Image info verification failed\n");
result.ResultSub(CResult::TEST_FAIL);
}
for (size_t frameIdx = 0; frameIdx < iterationNum; ++frameIdx)
{
if (!YUVSurfaceSet(surfaceFormat, surfaceSrc, bufferIn[frameIdx % FRAME_NUM], width, height))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
error = clEnqueueAcquireDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjSrcList.size()), &memObjSrcList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueAcquireDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
error = clEnqueueAcquireDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjDstList.size()), &memObjDstList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueAcquireDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
clSamplerWrapper sampler = clCreateSampler( ctx, CL_FALSE, CL_ADDRESS_NONE, CL_FILTER_NEAREST, &error );
if(error != CL_SUCCESS)
{
log_error("Unable to create sampler\n");
result.ResultSub(CResult::TEST_FAIL);
}
clProgramWrapper program;
clKernelWrapper kernel;
const char *progPtr = PROGRAM_STR.c_str();
if(create_single_kernel_helper(ctx, &program, &kernel, 1, (const char **)&progPtr, "TestFunction"))
result.ResultSub(CResult::TEST_FAIL);
size_t bufferSize = sizeof(cl_int) * 2;
clMemWrapper imageRes = clCreateBuffer( ctx, CL_MEM_READ_WRITE, bufferSize, NULL, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateBuffer failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
size_t offset = 0;
size_t origin[3] = {0,0,0};
std::vector<cl_uchar> out( frameSize, 0 );
for (size_t i = 0; i < memObjSrcList.size(); ++i)
{
size_t planeWidth = (i == 0) ? width: width / 2;
size_t planeHeight = (i == 0) ? height: height / 2;
size_t regionPlane[3] = {planeWidth, planeHeight, 1};
size_t threads[ 2 ] = { width, height };
error = clSetKernelArg( kernel, 0, sizeof( memObjSrcList[i] ), &memObjSrcList[i] );
if (error != CL_SUCCESS)
{
log_error("Unable to set kernel arguments" );
result.ResultSub(CResult::TEST_FAIL);
}
error = clSetKernelArg( kernel, 1, sizeof( memObjDstList[i] ), &memObjDstList[i] );
if (error != CL_SUCCESS)
{
log_error("Unable to set kernel arguments" );
result.ResultSub(CResult::TEST_FAIL);
}
error = clSetKernelArg( kernel, 2, sizeof( sampler ), &sampler );
if (error != CL_SUCCESS)
{
log_error("Unable to set kernel arguments" );
result.ResultSub(CResult::TEST_FAIL);
}
error = clSetKernelArg( kernel, 3, sizeof( imageRes ), &imageRes );
if (error != CL_SUCCESS)
{
log_error("Unable to set kernel arguments" );
result.ResultSub(CResult::TEST_FAIL);
}
size_t localThreads[ 2 ];
error = get_max_common_2D_work_group_size( ctx, kernel, threads, localThreads );
if (error != CL_SUCCESS)
{
log_error("Unable to get work group size to use" );
result.ResultSub(CResult::TEST_FAIL);
}
error = clEnqueueNDRangeKernel( cmdQueue, kernel, 2, NULL, threads, localThreads, 0, NULL, NULL );
if (error != CL_SUCCESS)
{
log_error("Unable to execute test kernel" );
result.ResultSub(CResult::TEST_FAIL);
}
std::vector<cl_uint> imageResOut(2, 0);
error = clEnqueueReadBuffer( cmdQueue, imageRes, CL_TRUE, 0, bufferSize, &imageResOut[0], 0, NULL, NULL );
if (error != CL_SUCCESS)
{
log_error("Unable to read buffer");
result.ResultSub(CResult::TEST_FAIL);
}
if(imageResOut[0] != planeWidth)
{
log_error("Invalid width value, test = %i, expected = %i\n", imageResOut[0], planeWidth);
result.ResultSub(CResult::TEST_FAIL);
}
if(imageResOut[1] != planeHeight)
{
log_error("Invalid height value, test = %i, expected = %i\n", imageResOut[1], planeHeight);
result.ResultSub(CResult::TEST_FAIL);
}
error = clEnqueueReadImage(cmdQueue, memObjDstList[i], CL_TRUE, origin, regionPlane, 0, 0, &out[offset], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReadImage failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
offset += planeWidth * planeHeight;
}
if (!YUVCompare(surfaceFormat, out, bufferExp[frameIdx % FRAME_NUM], width, height))
{
log_error("Frame idx: %i, OCL objects are different than expected\n", frameIdx);
result.ResultSub(CResult::TEST_FAIL);
}
error = clEnqueueReleaseDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjSrcList.size()), &memObjSrcList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReleaseDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
error = clEnqueueReleaseDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjDstList.size()), &memObjDstList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReleaseDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
std::vector<cl_uchar> bufferOut(frameSize, 0);
if (!YUVSurfaceGet(surfaceFormat, surfaceDst, bufferOut, width, height))
{
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVCompare(surfaceFormat, bufferOut, bufferExp[frameIdx % FRAME_NUM], width, height))
{
log_error("Frame idx: %i, media surface is different than expected\n", frameIdx);
result.ResultSub(CResult::TEST_FAIL);
}
}
}
if (!deviceWrapper->Status())
{
std::string adapter;
AdapterToString(adapterType, adapter);
log_error("%s init failed\n", adapter.c_str());
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
return result.Result();
}
int test_kernel(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
{
CResult result;
#if defined(_WIN32)
//D3D9
if(kernel_functions(deviceID, context, queue, num_elements, 10, 256, 256, CL_ADAPTER_D3D9_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9, NV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(kernel_functions(deviceID, context, queue, num_elements, 3, 256, 256, CL_ADAPTER_D3D9_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9, YV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
//D3D9EX
if(kernel_functions(deviceID, context, queue, num_elements, 5, 256, 512, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9EX, NV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(kernel_functions(deviceID, context, queue, num_elements, 7, 512, 256, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (D3D9EX, NV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(kernel_functions(deviceID, context, queue, num_elements, 10, 256, 256, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9EX, YV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(kernel_functions(deviceID, context, queue, num_elements, 15, 128, 128, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (D3D9EX, YV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
//DXVA
if(kernel_functions(deviceID, context, queue, num_elements, 20, 128, 128, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (DXVA, NV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(kernel_functions(deviceID, context, queue, num_elements, 40, 64, 64, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (DXVA, NV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(kernel_functions(deviceID, context, queue, num_elements, 5, 512, 512, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (DXVA, YV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(kernel_functions(deviceID, context, queue, num_elements, 2, 1024, 1024, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (DXVA, YV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
#else
return TEST_NOT_IMPLEMENTED;
#endif
return result.Result();
}

View File

@@ -1,6 +1,6 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
@@ -13,168 +13,168 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include "utils.h"
int get_device_ids(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements,
cl_dx9_media_adapter_type_khr adapterType)
{
CResult result;
std::auto_ptr<CDeviceWrapper> deviceWrapper;
if (!DeviceCreate(adapterType, deviceWrapper))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
cl_uint devicesExpectedNum = 0;
cl_int error = clGetDeviceIDs(gPlatformIDdetected, gDeviceTypeSelected, 0, 0, &devicesExpectedNum);
if (error != CL_SUCCESS || devicesExpectedNum < 1)
{
log_error("clGetDeviceIDs failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
std::vector<cl_device_id> devicesExpected(devicesExpectedNum);
error = clGetDeviceIDs(gPlatformIDdetected, CL_DEVICE_TYPE_GPU, devicesExpectedNum, &devicesExpected[0], 0);
if (error != CL_SUCCESS)
{
log_error("clGetDeviceIDs failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
while (deviceWrapper->AdapterNext())
{
std::vector<cl_dx9_media_adapter_type_khr> mediaAdapterTypes;
mediaAdapterTypes.push_back(adapterType);
cl_uint devicesAllNum = 0;
error = clGetDeviceIDsFromDX9MediaAdapterKHR(gPlatformIDdetected, 1, &mediaAdapterTypes[0], deviceWrapper->Device(),
CL_ALL_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR, 0, 0, &devicesAllNum);
if (error != CL_SUCCESS && error != CL_DEVICE_NOT_FOUND)
{
log_error("clGetDeviceIDsFromDX9MediaAdapterKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
std::vector<cl_device_id> devicesAll;
if (devicesAllNum > 0)
{
devicesAll.resize(devicesAllNum);
error = clGetDeviceIDsFromDX9MediaAdapterKHR(gPlatformIDdetected, 1, &mediaAdapterTypes[0], deviceWrapper->Device(),
CL_ALL_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR, devicesAllNum, &devicesAll[0], 0);
if (error != CL_SUCCESS)
{
log_error("clGetDeviceIDsFromDX9MediaAdapterKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
}
cl_uint devicesPreferredNum = 0;
error = clGetDeviceIDsFromDX9MediaAdapterKHR(gPlatformIDdetected, 1, &mediaAdapterTypes[0], deviceWrapper->Device(),
CL_PREFERRED_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR, 0, 0, &devicesPreferredNum);
if (error != CL_SUCCESS && error != CL_DEVICE_NOT_FOUND)
{
log_error("clGetDeviceIDsFromDX9MediaAdapterKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
std::vector<cl_device_id> devicesPreferred;
if (devicesPreferredNum > 0)
{
devicesPreferred.resize(devicesPreferredNum);
error = clGetDeviceIDsFromDX9MediaAdapterKHR(gPlatformIDdetected, 1, &mediaAdapterTypes[0], deviceWrapper->Device(),
CL_PREFERRED_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR, devicesPreferredNum, &devicesPreferred[0], 0);
if (error != CL_SUCCESS)
{
log_error("clGetDeviceIDsFromDX9MediaAdapterKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
}
if (devicesAllNum < devicesPreferredNum)
{
log_error("Invalid number of preferred devices. It should be a subset of all devices\n");
result.ResultSub(CResult::TEST_FAIL);
}
for (cl_uint i = 0; i < devicesPreferredNum; ++i)
{
cl_uint j = 0;
for (; j < devicesAllNum; ++j)
{
if (devicesPreferred[i] == devicesAll[j])
break;
}
if (j == devicesAllNum)
{
log_error("Preferred device is not a subset of all devices\n");
result.ResultSub(CResult::TEST_FAIL);
}
}
for (cl_uint i = 0; i < devicesAllNum; ++i)
{
cl_uint j = 0;
for (; j < devicesExpectedNum; ++j)
{
if (devicesAll[i] == devicesExpected[j])
break;
}
if (j == devicesExpectedNum)
{
log_error("CL_ALL_DEVICES_FOR_MEDIA_ADAPTER_KHR should be a subset of GPU devices for selected platform\n");
result.ResultSub(CResult::TEST_FAIL);
}
}
}
if (!deviceWrapper->Status())
{
std::string adapter;
AdapterToString(adapterType, adapter);
log_error("%s init failed\n", adapter.c_str());
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
return result.Result();
}
int test_get_device_ids(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
{
CResult result;
#if defined(_WIN32)
if(get_device_ids(deviceID, context, queue, num_elements, CL_ADAPTER_D3D9_KHR) != 0)
{
log_error("\nTest case (D3D9) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(get_device_ids(deviceID, context, queue, num_elements, CL_ADAPTER_D3D9EX_KHR) != 0)
{
log_error("\nTest case (D3D9EX) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(get_device_ids(deviceID, context, queue, num_elements, CL_ADAPTER_DXVA_KHR) != 0)
{
log_error("\nTest case (DXVA) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
#else
return TEST_NOT_IMPLEMENTED;
#endif
return result.Result();
}
#include "utils.h"
int get_device_ids(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements,
cl_dx9_media_adapter_type_khr adapterType)
{
CResult result;
std::auto_ptr<CDeviceWrapper> deviceWrapper;
if (!DeviceCreate(adapterType, deviceWrapper))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
cl_uint devicesExpectedNum = 0;
cl_int error = clGetDeviceIDs(gPlatformIDdetected, gDeviceTypeSelected, 0, 0, &devicesExpectedNum);
if (error != CL_SUCCESS || devicesExpectedNum < 1)
{
log_error("clGetDeviceIDs failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
std::vector<cl_device_id> devicesExpected(devicesExpectedNum);
error = clGetDeviceIDs(gPlatformIDdetected, CL_DEVICE_TYPE_GPU, devicesExpectedNum, &devicesExpected[0], 0);
if (error != CL_SUCCESS)
{
log_error("clGetDeviceIDs failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
while (deviceWrapper->AdapterNext())
{
std::vector<cl_dx9_media_adapter_type_khr> mediaAdapterTypes;
mediaAdapterTypes.push_back(adapterType);
cl_uint devicesAllNum = 0;
error = clGetDeviceIDsFromDX9MediaAdapterKHR(gPlatformIDdetected, 1, &mediaAdapterTypes[0], deviceWrapper->Device(),
CL_ALL_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR, 0, 0, &devicesAllNum);
if (error != CL_SUCCESS && error != CL_DEVICE_NOT_FOUND)
{
log_error("clGetDeviceIDsFromDX9MediaAdapterKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
std::vector<cl_device_id> devicesAll;
if (devicesAllNum > 0)
{
devicesAll.resize(devicesAllNum);
error = clGetDeviceIDsFromDX9MediaAdapterKHR(gPlatformIDdetected, 1, &mediaAdapterTypes[0], deviceWrapper->Device(),
CL_ALL_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR, devicesAllNum, &devicesAll[0], 0);
if (error != CL_SUCCESS)
{
log_error("clGetDeviceIDsFromDX9MediaAdapterKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
}
cl_uint devicesPreferredNum = 0;
error = clGetDeviceIDsFromDX9MediaAdapterKHR(gPlatformIDdetected, 1, &mediaAdapterTypes[0], deviceWrapper->Device(),
CL_PREFERRED_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR, 0, 0, &devicesPreferredNum);
if (error != CL_SUCCESS && error != CL_DEVICE_NOT_FOUND)
{
log_error("clGetDeviceIDsFromDX9MediaAdapterKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
std::vector<cl_device_id> devicesPreferred;
if (devicesPreferredNum > 0)
{
devicesPreferred.resize(devicesPreferredNum);
error = clGetDeviceIDsFromDX9MediaAdapterKHR(gPlatformIDdetected, 1, &mediaAdapterTypes[0], deviceWrapper->Device(),
CL_PREFERRED_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR, devicesPreferredNum, &devicesPreferred[0], 0);
if (error != CL_SUCCESS)
{
log_error("clGetDeviceIDsFromDX9MediaAdapterKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
}
if (devicesAllNum < devicesPreferredNum)
{
log_error("Invalid number of preferred devices. It should be a subset of all devices\n");
result.ResultSub(CResult::TEST_FAIL);
}
for (cl_uint i = 0; i < devicesPreferredNum; ++i)
{
cl_uint j = 0;
for (; j < devicesAllNum; ++j)
{
if (devicesPreferred[i] == devicesAll[j])
break;
}
if (j == devicesAllNum)
{
log_error("Preferred device is not a subset of all devices\n");
result.ResultSub(CResult::TEST_FAIL);
}
}
for (cl_uint i = 0; i < devicesAllNum; ++i)
{
cl_uint j = 0;
for (; j < devicesExpectedNum; ++j)
{
if (devicesAll[i] == devicesExpected[j])
break;
}
if (j == devicesExpectedNum)
{
log_error("CL_ALL_DEVICES_FOR_MEDIA_ADAPTER_KHR should be a subset of GPU devices for selected platform\n");
result.ResultSub(CResult::TEST_FAIL);
}
}
}
if (!deviceWrapper->Status())
{
std::string adapter;
AdapterToString(adapterType, adapter);
log_error("%s init failed\n", adapter.c_str());
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
return result.Result();
}
int test_get_device_ids(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
{
CResult result;
#if defined(_WIN32)
if(get_device_ids(deviceID, context, queue, num_elements, CL_ADAPTER_D3D9_KHR) != 0)
{
log_error("\nTest case (D3D9) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(get_device_ids(deviceID, context, queue, num_elements, CL_ADAPTER_D3D9EX_KHR) != 0)
{
log_error("\nTest case (D3D9EX) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(get_device_ids(deviceID, context, queue, num_elements, CL_ADAPTER_DXVA_KHR) != 0)
{
log_error("\nTest case (DXVA) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
#else
return TEST_NOT_IMPLEMENTED;
#endif
return result.Result();
}

View File

@@ -1,6 +1,6 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
@@ -13,326 +13,326 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include "utils.h"
int interop_user_sync(cl_device_id deviceID, cl_context context, cl_command_queue queue,
int num_elements, unsigned int width, unsigned int height,
TContextFuncType functionCreate, cl_dx9_media_adapter_type_khr adapterType,
TSurfaceFormat surfaceFormat, TSharedHandleType sharedHandle, cl_bool userSync)
{
CResult result;
//create device
std::auto_ptr<CDeviceWrapper> deviceWrapper;
if (!DeviceCreate(adapterType, deviceWrapper))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
//generate input data
std::vector<cl_uchar> bufferIn(width * height * 3 / 2, 0);
if(!YUVGenerate(surfaceFormat, bufferIn, width, height, 0, 255))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
while (deviceWrapper->AdapterNext())
{
if (surfaceFormat != SURFACE_FORMAT_NV12 &&
!SurfaceFormatCheck(adapterType, *deviceWrapper, surfaceFormat))
{
std::string sharedHandleStr = (sharedHandle == SHARED_HANDLE_ENABLED)? "yes": "no";
std::string syncStr = (userSync == CL_TRUE) ? "yes": "no";
std::string formatStr;
std::string adapterStr;
SurfaceFormatToString(surfaceFormat, formatStr);
AdapterToString(adapterType, adapterStr);
log_info("Skipping test case, image format is not supported by a device (adapter type: %s, format: %s, shared handle: %s, user sync: %s)\n",
adapterStr.c_str(), formatStr.c_str(), sharedHandleStr.c_str(), syncStr.c_str());
return result.Result();
}
void *objectSharedHandle = 0;
std::auto_ptr<CSurfaceWrapper> surface;
if (!MediaSurfaceCreate(adapterType, width, height, surfaceFormat, *deviceWrapper, surface,
(sharedHandle == SHARED_HANDLE_ENABLED) ? true: false, &objectSharedHandle))
{
log_error("Media surface creation failed for %i adapter\n", deviceWrapper->AdapterIdx());
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
cl_context_properties contextProperties[] = {
CL_CONTEXT_PLATFORM, (cl_context_properties)gPlatformIDdetected,
AdapterTypeToContextInfo(adapterType), (cl_context_properties)deviceWrapper->Device(),
CL_CONTEXT_INTEROP_USER_SYNC, userSync,
0,
};
cl_int error;
clContextWrapper ctx;
switch(functionCreate)
{
case CONTEXT_CREATE_DEFAULT:
ctx = clCreateContext(&contextProperties[0], 1, &gDeviceIDdetected, NULL, NULL, &error);
break;
case CONTEXT_CREATE_FROM_TYPE:
ctx = clCreateContextFromType(&contextProperties[0], gDeviceTypeSelected, NULL, NULL, &error);
break;
default:
log_error("Unknown context creation function enum\n");
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
break;
}
if (error != CL_SUCCESS)
{
std::string functionName;
FunctionContextCreateToString(functionCreate, functionName);
log_error("%s failed: %s\n", functionName.c_str(), IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVSurfaceSet(surfaceFormat, surface, bufferIn, width, height))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
#if defined(_WIN32)
cl_dx9_surface_info_khr surfaceInfo;
surfaceInfo.resource = *(static_cast<CD3D9SurfaceWrapper *>(surface.get()));
surfaceInfo.shared_handle = objectSharedHandle;
#else
void *surfaceInfo = 0;
return TEST_NOT_IMPLEMENTED;
#endif
std::vector<cl_mem> memObjList;
unsigned int planesNum = PlanesNum(surfaceFormat);
std::vector<clMemWrapper> planesList(planesNum);
for (unsigned int planeIdx = 0; planeIdx < planesNum; ++planeIdx)
{
planesList[planeIdx] = clCreateFromDX9MediaSurfaceKHR(ctx, CL_MEM_READ_WRITE, adapterType, &surfaceInfo, planeIdx, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateFromDX9MediaSurfaceKHR failed for plane %i: %s\n", planeIdx, IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
memObjList.push_back(planesList[planeIdx]);
}
clCommandQueueWrapper cmdQueue = clCreateCommandQueue(ctx, gDeviceIDdetected, 0, &error );
if (error != CL_SUCCESS)
{
log_error("Unable to create command queue: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!ImageInfoVerify(adapterType, memObjList, width, height, surface, objectSharedHandle))
{
log_error("Image info verification failed\n");
result.ResultSub(CResult::TEST_FAIL);
}
if (userSync == CL_TRUE)
{
#if defined(_WIN32)
IDirect3DQuery9* eventQuery = NULL;
switch (adapterType)
{
case CL_ADAPTER_D3D9_KHR:
{
LPDIRECT3DDEVICE9 device = (LPDIRECT3DDEVICE9)deviceWrapper->Device();
device->CreateQuery(D3DQUERYTYPE_EVENT, &eventQuery);
eventQuery->Issue(D3DISSUE_END);
while (S_FALSE == eventQuery->GetData(NULL, 0, D3DGETDATA_FLUSH))
;
}
break;
case CL_ADAPTER_D3D9EX_KHR:
{
LPDIRECT3DDEVICE9EX device = (LPDIRECT3DDEVICE9EX)deviceWrapper->Device();
device->CreateQuery(D3DQUERYTYPE_EVENT, &eventQuery);
eventQuery->Issue(D3DISSUE_END);
while (S_FALSE == eventQuery->GetData(NULL, 0, D3DGETDATA_FLUSH))
;
}
break;
case CL_ADAPTER_DXVA_KHR:
{
CDXVAWrapper *DXVADevice = dynamic_cast<CDXVAWrapper *>(&(*deviceWrapper));
LPDIRECT3DDEVICE9EX device = (LPDIRECT3DDEVICE9EX)(DXVADevice->D3D9()).Device();
device->CreateQuery(D3DQUERYTYPE_EVENT, &eventQuery);
eventQuery->Issue(D3DISSUE_END);
while (S_FALSE == eventQuery->GetData(NULL, 0, D3DGETDATA_FLUSH))
;
}
break;
default:
log_error("Unknown adapter type\n");
return false;
break;
}
#else
return TEST_NOT_IMPLEMENTED;
#endif
}
error = clEnqueueAcquireDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList.at(0), 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueAcquireDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
size_t origin[3] = {0,0,0};
size_t offset = 0;
size_t frameSize = width * height * 3 / 2;
std::vector<cl_uchar> out( frameSize, 0 );
for (size_t i = 0; i < memObjList.size(); ++i)
{
size_t planeWidth = (i == 0) ? width: width / 2;
size_t planeHeight = (i == 0) ? height: height / 2;
size_t regionPlane[3] = {planeWidth, planeHeight, 1};
error = clEnqueueReadImage(cmdQueue, memObjList.at(i), CL_TRUE, origin, regionPlane, 0, 0, &out.at(offset), 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReadImage failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
offset += planeWidth * planeHeight;
}
if (!YUVCompare(surfaceFormat, out, bufferIn, width, height))
{
log_error("OCL object verification failed - clEnqueueReadImage\n");
result.ResultSub(CResult::TEST_FAIL);
}
error = clEnqueueReleaseDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList.at(0), 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReleaseDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
if (userSync == CL_TRUE)
{
error = clFinish(cmdQueue);
if (error != CL_SUCCESS)
{
log_error("clFinish failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
}
//shared object verification
std::vector<cl_uchar> bufferOut(frameSize, 0);
if (!YUVSurfaceGet(surfaceFormat, surface, bufferOut, width, height))
{
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVCompare(surfaceFormat, bufferOut, bufferIn, width, height))
{
log_error("Media surface is different than expected\n");
result.ResultSub(CResult::TEST_FAIL);
}
}
if (!deviceWrapper->Status())
{
std::string adapterName;
AdapterToString(adapterType, adapterName);
log_error("%s init failed\n", adapterName.c_str());
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
return result.Result();
}
int test_interop_user_sync(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
{
const unsigned int WIDTH = 256;
const unsigned int HEIGHT = 256;
std::vector<cl_dx9_media_adapter_type_khr> adapters;
#if defined(_WIN32)
adapters.push_back(CL_ADAPTER_D3D9_KHR);
adapters.push_back(CL_ADAPTER_D3D9EX_KHR);
adapters.push_back(CL_ADAPTER_DXVA_KHR);
#else
return TEST_NOT_IMPLEMENTED;
#endif
std::vector<TContextFuncType> contextFuncs;
contextFuncs.push_back(CONTEXT_CREATE_DEFAULT);
contextFuncs.push_back(CONTEXT_CREATE_FROM_TYPE);
std::vector<TSurfaceFormat> formats;
formats.push_back(SURFACE_FORMAT_NV12);
formats.push_back(SURFACE_FORMAT_YV12);
std::vector<TSharedHandleType> sharedHandleTypes;
sharedHandleTypes.push_back(SHARED_HANDLE_DISABLED);
sharedHandleTypes.push_back(SHARED_HANDLE_ENABLED);
std::vector<cl_bool> sync;
sync.push_back(CL_FALSE);
sync.push_back(CL_TRUE);
CResult result;
for (size_t adapterIdx = 0; adapterIdx < adapters.size(); ++adapterIdx)
{
//iteration through all create context functions
for (size_t contextFuncIdx = 0; contextFuncIdx < contextFuncs.size(); ++contextFuncIdx)
{
//iteration through YUV formats
for (size_t formatIdx = 0; formatIdx < formats.size(); ++formatIdx)
{
//shared handle enabled or disabled
for (size_t sharedHandleIdx = 0; sharedHandleIdx < sharedHandleTypes.size(); ++sharedHandleIdx)
{
//user sync interop disabled or enabled
for (size_t syncIdx = 0; syncIdx < sync.size(); ++syncIdx)
{
if (adapters[adapterIdx] == CL_ADAPTER_D3D9_KHR && sharedHandleTypes[sharedHandleIdx] == SHARED_HANDLE_ENABLED)
continue;
if(interop_user_sync(deviceID, context, queue, num_elements, WIDTH, HEIGHT,
contextFuncs[contextFuncIdx], adapters[adapterIdx], formats[formatIdx],
sharedHandleTypes[sharedHandleIdx], sync[syncIdx]) != 0)
{
std::string syncStr = (sync[syncIdx] == CL_TRUE) ? "user sync enabled": "user sync disabled";
std::string sharedHandle = (sharedHandleTypes[sharedHandleIdx] == SHARED_HANDLE_ENABLED)? "shared handle": "no shared handle";
std::string adapterStr;
std::string formatStr;
SurfaceFormatToString(formats[formatIdx], formatStr);
AdapterToString(adapters[adapterIdx], adapterStr);
log_error("\nTest case - clCreateContext (%s, %s, %s, %s) failed\n\n", adapterStr.c_str(), formatStr.c_str(), sharedHandle.c_str(), syncStr.c_str());
result.ResultSub(CResult::TEST_FAIL);
}
}
}
}
}
}
return result.Result();
}
#include "utils.h"
int interop_user_sync(cl_device_id deviceID, cl_context context, cl_command_queue queue,
int num_elements, unsigned int width, unsigned int height,
TContextFuncType functionCreate, cl_dx9_media_adapter_type_khr adapterType,
TSurfaceFormat surfaceFormat, TSharedHandleType sharedHandle, cl_bool userSync)
{
CResult result;
//create device
std::auto_ptr<CDeviceWrapper> deviceWrapper;
if (!DeviceCreate(adapterType, deviceWrapper))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
//generate input data
std::vector<cl_uchar> bufferIn(width * height * 3 / 2, 0);
if(!YUVGenerate(surfaceFormat, bufferIn, width, height, 0, 255))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
while (deviceWrapper->AdapterNext())
{
if (surfaceFormat != SURFACE_FORMAT_NV12 &&
!SurfaceFormatCheck(adapterType, *deviceWrapper, surfaceFormat))
{
std::string sharedHandleStr = (sharedHandle == SHARED_HANDLE_ENABLED)? "yes": "no";
std::string syncStr = (userSync == CL_TRUE) ? "yes": "no";
std::string formatStr;
std::string adapterStr;
SurfaceFormatToString(surfaceFormat, formatStr);
AdapterToString(adapterType, adapterStr);
log_info("Skipping test case, image format is not supported by a device (adapter type: %s, format: %s, shared handle: %s, user sync: %s)\n",
adapterStr.c_str(), formatStr.c_str(), sharedHandleStr.c_str(), syncStr.c_str());
return result.Result();
}
void *objectSharedHandle = 0;
std::auto_ptr<CSurfaceWrapper> surface;
if (!MediaSurfaceCreate(adapterType, width, height, surfaceFormat, *deviceWrapper, surface,
(sharedHandle == SHARED_HANDLE_ENABLED) ? true: false, &objectSharedHandle))
{
log_error("Media surface creation failed for %i adapter\n", deviceWrapper->AdapterIdx());
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
cl_context_properties contextProperties[] = {
CL_CONTEXT_PLATFORM, (cl_context_properties)gPlatformIDdetected,
AdapterTypeToContextInfo(adapterType), (cl_context_properties)deviceWrapper->Device(),
CL_CONTEXT_INTEROP_USER_SYNC, userSync,
0,
};
cl_int error;
clContextWrapper ctx;
switch(functionCreate)
{
case CONTEXT_CREATE_DEFAULT:
ctx = clCreateContext(&contextProperties[0], 1, &gDeviceIDdetected, NULL, NULL, &error);
break;
case CONTEXT_CREATE_FROM_TYPE:
ctx = clCreateContextFromType(&contextProperties[0], gDeviceTypeSelected, NULL, NULL, &error);
break;
default:
log_error("Unknown context creation function enum\n");
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
break;
}
if (error != CL_SUCCESS)
{
std::string functionName;
FunctionContextCreateToString(functionCreate, functionName);
log_error("%s failed: %s\n", functionName.c_str(), IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVSurfaceSet(surfaceFormat, surface, bufferIn, width, height))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
#if defined(_WIN32)
cl_dx9_surface_info_khr surfaceInfo;
surfaceInfo.resource = *(static_cast<CD3D9SurfaceWrapper *>(surface.get()));
surfaceInfo.shared_handle = objectSharedHandle;
#else
void *surfaceInfo = 0;
return TEST_NOT_IMPLEMENTED;
#endif
std::vector<cl_mem> memObjList;
unsigned int planesNum = PlanesNum(surfaceFormat);
std::vector<clMemWrapper> planesList(planesNum);
for (unsigned int planeIdx = 0; planeIdx < planesNum; ++planeIdx)
{
planesList[planeIdx] = clCreateFromDX9MediaSurfaceKHR(ctx, CL_MEM_READ_WRITE, adapterType, &surfaceInfo, planeIdx, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateFromDX9MediaSurfaceKHR failed for plane %i: %s\n", planeIdx, IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
memObjList.push_back(planesList[planeIdx]);
}
clCommandQueueWrapper cmdQueue = clCreateCommandQueue(ctx, gDeviceIDdetected, 0, &error );
if (error != CL_SUCCESS)
{
log_error("Unable to create command queue: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!ImageInfoVerify(adapterType, memObjList, width, height, surface, objectSharedHandle))
{
log_error("Image info verification failed\n");
result.ResultSub(CResult::TEST_FAIL);
}
if (userSync == CL_TRUE)
{
#if defined(_WIN32)
IDirect3DQuery9* eventQuery = NULL;
switch (adapterType)
{
case CL_ADAPTER_D3D9_KHR:
{
LPDIRECT3DDEVICE9 device = (LPDIRECT3DDEVICE9)deviceWrapper->Device();
device->CreateQuery(D3DQUERYTYPE_EVENT, &eventQuery);
eventQuery->Issue(D3DISSUE_END);
while (S_FALSE == eventQuery->GetData(NULL, 0, D3DGETDATA_FLUSH))
;
}
break;
case CL_ADAPTER_D3D9EX_KHR:
{
LPDIRECT3DDEVICE9EX device = (LPDIRECT3DDEVICE9EX)deviceWrapper->Device();
device->CreateQuery(D3DQUERYTYPE_EVENT, &eventQuery);
eventQuery->Issue(D3DISSUE_END);
while (S_FALSE == eventQuery->GetData(NULL, 0, D3DGETDATA_FLUSH))
;
}
break;
case CL_ADAPTER_DXVA_KHR:
{
CDXVAWrapper *DXVADevice = dynamic_cast<CDXVAWrapper *>(&(*deviceWrapper));
LPDIRECT3DDEVICE9EX device = (LPDIRECT3DDEVICE9EX)(DXVADevice->D3D9()).Device();
device->CreateQuery(D3DQUERYTYPE_EVENT, &eventQuery);
eventQuery->Issue(D3DISSUE_END);
while (S_FALSE == eventQuery->GetData(NULL, 0, D3DGETDATA_FLUSH))
;
}
break;
default:
log_error("Unknown adapter type\n");
return false;
break;
}
#else
return TEST_NOT_IMPLEMENTED;
#endif
}
error = clEnqueueAcquireDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList.at(0), 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueAcquireDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
size_t origin[3] = {0,0,0};
size_t offset = 0;
size_t frameSize = width * height * 3 / 2;
std::vector<cl_uchar> out( frameSize, 0 );
for (size_t i = 0; i < memObjList.size(); ++i)
{
size_t planeWidth = (i == 0) ? width: width / 2;
size_t planeHeight = (i == 0) ? height: height / 2;
size_t regionPlane[3] = {planeWidth, planeHeight, 1};
error = clEnqueueReadImage(cmdQueue, memObjList.at(i), CL_TRUE, origin, regionPlane, 0, 0, &out.at(offset), 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReadImage failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
offset += planeWidth * planeHeight;
}
if (!YUVCompare(surfaceFormat, out, bufferIn, width, height))
{
log_error("OCL object verification failed - clEnqueueReadImage\n");
result.ResultSub(CResult::TEST_FAIL);
}
error = clEnqueueReleaseDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList.at(0), 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReleaseDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
if (userSync == CL_TRUE)
{
error = clFinish(cmdQueue);
if (error != CL_SUCCESS)
{
log_error("clFinish failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
}
//shared object verification
std::vector<cl_uchar> bufferOut(frameSize, 0);
if (!YUVSurfaceGet(surfaceFormat, surface, bufferOut, width, height))
{
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVCompare(surfaceFormat, bufferOut, bufferIn, width, height))
{
log_error("Media surface is different than expected\n");
result.ResultSub(CResult::TEST_FAIL);
}
}
if (!deviceWrapper->Status())
{
std::string adapterName;
AdapterToString(adapterType, adapterName);
log_error("%s init failed\n", adapterName.c_str());
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
return result.Result();
}
int test_interop_user_sync(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
{
const unsigned int WIDTH = 256;
const unsigned int HEIGHT = 256;
std::vector<cl_dx9_media_adapter_type_khr> adapters;
#if defined(_WIN32)
adapters.push_back(CL_ADAPTER_D3D9_KHR);
adapters.push_back(CL_ADAPTER_D3D9EX_KHR);
adapters.push_back(CL_ADAPTER_DXVA_KHR);
#else
return TEST_NOT_IMPLEMENTED;
#endif
std::vector<TContextFuncType> contextFuncs;
contextFuncs.push_back(CONTEXT_CREATE_DEFAULT);
contextFuncs.push_back(CONTEXT_CREATE_FROM_TYPE);
std::vector<TSurfaceFormat> formats;
formats.push_back(SURFACE_FORMAT_NV12);
formats.push_back(SURFACE_FORMAT_YV12);
std::vector<TSharedHandleType> sharedHandleTypes;
sharedHandleTypes.push_back(SHARED_HANDLE_DISABLED);
sharedHandleTypes.push_back(SHARED_HANDLE_ENABLED);
std::vector<cl_bool> sync;
sync.push_back(CL_FALSE);
sync.push_back(CL_TRUE);
CResult result;
for (size_t adapterIdx = 0; adapterIdx < adapters.size(); ++adapterIdx)
{
//iteration through all create context functions
for (size_t contextFuncIdx = 0; contextFuncIdx < contextFuncs.size(); ++contextFuncIdx)
{
//iteration through YUV formats
for (size_t formatIdx = 0; formatIdx < formats.size(); ++formatIdx)
{
//shared handle enabled or disabled
for (size_t sharedHandleIdx = 0; sharedHandleIdx < sharedHandleTypes.size(); ++sharedHandleIdx)
{
//user sync interop disabled or enabled
for (size_t syncIdx = 0; syncIdx < sync.size(); ++syncIdx)
{
if (adapters[adapterIdx] == CL_ADAPTER_D3D9_KHR && sharedHandleTypes[sharedHandleIdx] == SHARED_HANDLE_ENABLED)
continue;
if(interop_user_sync(deviceID, context, queue, num_elements, WIDTH, HEIGHT,
contextFuncs[contextFuncIdx], adapters[adapterIdx], formats[formatIdx],
sharedHandleTypes[sharedHandleIdx], sync[syncIdx]) != 0)
{
std::string syncStr = (sync[syncIdx] == CL_TRUE) ? "user sync enabled": "user sync disabled";
std::string sharedHandle = (sharedHandleTypes[sharedHandleIdx] == SHARED_HANDLE_ENABLED)? "shared handle": "no shared handle";
std::string adapterStr;
std::string formatStr;
SurfaceFormatToString(formats[formatIdx], formatStr);
AdapterToString(adapters[adapterIdx], adapterStr);
log_error("\nTest case - clCreateContext (%s, %s, %s, %s) failed\n\n", adapterStr.c_str(), formatStr.c_str(), sharedHandle.c_str(), syncStr.c_str());
result.ResultSub(CResult::TEST_FAIL);
}
}
}
}
}
}
return result.Result();
}

View File

@@ -1,6 +1,6 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
@@ -13,443 +13,443 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include "utils.h"
int memory_access(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements,
unsigned int width, unsigned int height, cl_dx9_media_adapter_type_khr adapterType,
TSurfaceFormat surfaceFormat, TSharedHandleType sharedHandle)
{
CResult result;
std::auto_ptr<CDeviceWrapper> deviceWrapper;
//creates device
if (!DeviceCreate(adapterType, deviceWrapper))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
//generate input and expected data
size_t frameSize = width * height * 3 / 2;
std::vector<cl_uchar> bufferRef0(frameSize, 0);
std::vector<cl_uchar> bufferRef1(frameSize, 0);
std::vector<cl_uchar> bufferRef2(frameSize, 0);
if (!YUVGenerate(surfaceFormat, bufferRef0, width, height, 0, 90) ||
!YUVGenerate(surfaceFormat, bufferRef1, width, height, 91, 180) ||
!YUVGenerate(surfaceFormat, bufferRef2, width, height, 181, 255))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
//iterates through all devices
while (deviceWrapper->AdapterNext())
{
if (surfaceFormat != SURFACE_FORMAT_NV12 && !SurfaceFormatCheck(adapterType, *deviceWrapper, surfaceFormat))
{
std::string sharedHandleStr = (sharedHandle == SHARED_HANDLE_ENABLED)? "yes": "no";
std::string formatStr;
std::string adapterStr;
SurfaceFormatToString(surfaceFormat, formatStr);
AdapterToString(adapterType, adapterStr);
log_info("Skipping test case, image format is not supported by a device (adapter type: %s, format: %s, shared handle: %s)\n",
adapterStr.c_str(), formatStr.c_str(), sharedHandleStr.c_str());
return result.Result();
}
void *objectSharedHandle = 0;
std::auto_ptr<CSurfaceWrapper> surface;
//creates surface
if (!MediaSurfaceCreate(adapterType, width, height, surfaceFormat, *deviceWrapper, surface,
(sharedHandle == SHARED_HANDLE_ENABLED) ? true: false, &objectSharedHandle))
{
log_error("Media surface creation failed for %i adapter\n", deviceWrapper->AdapterIdx());
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
if (!YUVSurfaceSet(surfaceFormat, surface, bufferRef0, width, height))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
cl_context_properties contextProperties[] = {
CL_CONTEXT_PLATFORM, (cl_context_properties)gPlatformIDdetected,
AdapterTypeToContextInfo(adapterType), (cl_context_properties)deviceWrapper->Device(),
0,
};
cl_int error;
clContextWrapper ctx = clCreateContext(&contextProperties[0], 1, &gDeviceIDdetected, NULL, NULL, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateContext failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
clCommandQueueWrapper cmdQueue = clCreateCommandQueue(ctx, gDeviceIDdetected, 0, &error );
if (error != CL_SUCCESS)
{
log_error("Unable to create command queue: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
{ //memory access write
#if defined(_WIN32)
cl_dx9_surface_info_khr surfaceInfo;
surfaceInfo.resource = *(static_cast<CD3D9SurfaceWrapper *>(surface.get()));
surfaceInfo.shared_handle = objectSharedHandle;
#else
void *surfaceInfo = 0;
return TEST_NOT_IMPLEMENTED;
#endif
std::vector<cl_mem> memObjList;
unsigned int planesNum = PlanesNum(surfaceFormat);
std::vector<clMemWrapper> planesList(planesNum);
for (unsigned int planeIdx = 0; planeIdx < planesNum; ++planeIdx)
{
planesList[planeIdx] = clCreateFromDX9MediaSurfaceKHR(ctx, CL_MEM_WRITE_ONLY, adapterType, &surfaceInfo, planeIdx, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateFromDX9MediaSurfaceKHR failed for WRITE_ONLY plane %i: %s\n", planeIdx, IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
memObjList.push_back(planesList[planeIdx]);
}
error = clEnqueueAcquireDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueAcquireDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
size_t offset = 0;
size_t origin[3] = {0,0,0};
for (size_t i = 0; i < memObjList.size(); ++i)
{
size_t planeWidth = (i == 0) ? width: width / 2;
size_t planeHeight = (i == 0) ? height: height / 2;
size_t regionPlane[3] = {planeWidth, planeHeight, 1};
error = clEnqueueWriteImage(cmdQueue, memObjList[i], CL_TRUE, origin, regionPlane,
0, 0, &bufferRef1[offset], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueWriteImage failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
offset += planeWidth * planeHeight;
}
error = clEnqueueReleaseDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReleaseDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
}
std::vector<cl_uchar> bufferOut0(frameSize, 0);
if (!YUVSurfaceGet(surfaceFormat, surface, bufferOut0, width, height))
{
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVCompare(surfaceFormat, bufferOut0, bufferRef1, width, height))
{
log_error("Media surface is different than expected\n");
result.ResultSub(CResult::TEST_FAIL);
}
{ //memory access read
#if defined(_WIN32)
cl_dx9_surface_info_khr surfaceInfo;
surfaceInfo.resource = *(static_cast<CD3D9SurfaceWrapper *>(surface.get()));
surfaceInfo.shared_handle = objectSharedHandle;
#else
void *surfaceInfo = 0;
return TEST_NOT_IMPLEMENTED;
#endif
std::vector<cl_mem> memObjList;
unsigned int planesNum = PlanesNum(surfaceFormat);
std::vector<clMemWrapper> planesList(planesNum);
for (unsigned int planeIdx = 0; planeIdx < planesNum; ++planeIdx)
{
planesList[planeIdx] = clCreateFromDX9MediaSurfaceKHR(ctx, CL_MEM_READ_ONLY, adapterType, &surfaceInfo, planeIdx, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateFromDX9MediaSurfaceKHR failed for READ_ONLY plane %i: %s\n", planeIdx, IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
memObjList.push_back(planesList[planeIdx]);
}
error = clEnqueueAcquireDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueAcquireDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
std::vector<cl_uchar> out( frameSize, 0 );
size_t offset = 0;
size_t origin[3] = {0,0,0};
for (size_t i = 0; i < memObjList.size(); ++i)
{
size_t planeWidth = (i == 0) ? width: width / 2;
size_t planeHeight = (i == 0) ? height: height / 2;
size_t regionPlane[3] = {planeWidth, planeHeight, 1};
error = clEnqueueReadImage(cmdQueue, memObjList[i], CL_TRUE, origin, regionPlane, 0, 0,
&out[offset], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReadImage failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
offset += planeWidth * planeHeight;
}
if (!YUVCompare(surfaceFormat, out, bufferRef1, width, height))
{
log_error("OCL image (READ_ONLY) is different then expected\n");
result.ResultSub(CResult::TEST_FAIL);
}
error = clEnqueueReleaseDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReleaseDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
}
std::vector<cl_uchar> bufferOut1(frameSize, 0);
if (!YUVSurfaceGet(surfaceFormat, surface, bufferOut1, width, height))
{
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVCompare(surfaceFormat, bufferOut1, bufferRef1, width, height))
{
log_error("Media surface is different than expected\n");
result.ResultSub(CResult::TEST_FAIL);
}
{ //memory access read write
#if defined(_WIN32)
cl_dx9_surface_info_khr surfaceInfo;
surfaceInfo.resource = *(static_cast<CD3D9SurfaceWrapper *>(surface.get()));
surfaceInfo.shared_handle = objectSharedHandle;
#else
void *surfaceInfo = 0;
return TEST_NOT_IMPLEMENTED;
#endif
std::vector<cl_mem> memObjList;
unsigned int planesNum = PlanesNum(surfaceFormat);
std::vector<clMemWrapper> planesList(planesNum);
for (unsigned int planeIdx = 0; planeIdx < planesNum; ++planeIdx)
{
planesList[planeIdx] = clCreateFromDX9MediaSurfaceKHR(ctx, CL_MEM_READ_WRITE, adapterType, &surfaceInfo, planeIdx, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateFromDX9MediaSurfaceKHR failed for READ_WRITE plane %i: %s\n", planeIdx, IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
memObjList.push_back(planesList[planeIdx]);
}
error = clEnqueueAcquireDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueAcquireDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
{ //read
std::vector<cl_uchar> out( frameSize, 0 );
size_t offset = 0;
size_t origin[3] = {0,0,0};
for (size_t i = 0; i < memObjList.size(); ++i)
{
size_t planeWidth = (i == 0) ? width: width / 2;
size_t planeHeight = (i == 0) ? height: height / 2;
size_t regionPlane[3] = {planeWidth, planeHeight, 1};
error = clEnqueueReadImage(cmdQueue, memObjList[i], CL_TRUE, origin, regionPlane, 0, 0,
&out[offset], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReadImage failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
offset += planeWidth * planeHeight;
}
if (!YUVCompare(surfaceFormat, out, bufferRef1, width, height))
{
log_error("OCL image (READ_WRITE) is different then expected\n");
result.ResultSub(CResult::TEST_FAIL);
}
}
{ //write
size_t offset = 0;
size_t origin[3] = {0,0,0};
for (size_t i = 0; i < memObjList.size(); ++i)
{
size_t planeWidth = (i == 0) ? width: width / 2;
size_t planeHeight = (i == 0) ? height: height / 2;
size_t regionPlane[3] = {planeWidth, planeHeight, 1};
error = clEnqueueWriteImage(cmdQueue, memObjList[i], CL_TRUE, origin, regionPlane,
0, 0, &bufferRef2[offset], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueWriteImage failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
offset += planeWidth * planeHeight;
}
}
error = clEnqueueReleaseDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReleaseDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
}
std::vector<cl_uchar> bufferOut2(frameSize, 0);
if (!YUVSurfaceGet(surfaceFormat, surface, bufferOut2, width, height))
{
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVCompare(surfaceFormat, bufferOut2, bufferRef2, width, height))
{
log_error("Media surface is different than expected\n");
result.ResultSub(CResult::TEST_FAIL);
}
}
if (!deviceWrapper->Status())
{
std::string adapterName;
AdapterToString(adapterType, adapterName);
log_error("%s init failed\n", adapterName.c_str());
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
return result.Result();
}
int test_memory_access(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
{
CResult result;
#if defined(_WIN32)
//D3D9
if(memory_access(deviceID, context, queue, num_elements, 256, 256, CL_ADAPTER_D3D9_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9, NV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(memory_access(deviceID, context, queue, num_elements, 512, 256, CL_ADAPTER_D3D9_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9, YV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
//D3D9EX
if(memory_access(deviceID, context, queue, num_elements, 256, 512, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9EX, NV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(memory_access(deviceID, context, queue, num_elements, 512, 256, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (D3D9EX, NV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(memory_access(deviceID, context, queue, num_elements, 256, 256, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9EX, YV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(memory_access(deviceID, context, queue, num_elements, 128, 128, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (D3D9EX, YV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
//DXVA
if(memory_access(deviceID, context, queue, num_elements, 128, 128, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (DXVA, NV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(memory_access(deviceID, context, queue, num_elements, 64, 64, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (DXVA, NV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(memory_access(deviceID, context, queue, num_elements, 512, 512, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (DXVA, YV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(memory_access(deviceID, context, queue, num_elements, 1024, 1024, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (DXVA, YV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
#else
return TEST_NOT_IMPLEMENTED;
#endif
return result.Result();
#include "utils.h"
int memory_access(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements,
unsigned int width, unsigned int height, cl_dx9_media_adapter_type_khr adapterType,
TSurfaceFormat surfaceFormat, TSharedHandleType sharedHandle)
{
CResult result;
std::auto_ptr<CDeviceWrapper> deviceWrapper;
//creates device
if (!DeviceCreate(adapterType, deviceWrapper))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
//generate input and expected data
size_t frameSize = width * height * 3 / 2;
std::vector<cl_uchar> bufferRef0(frameSize, 0);
std::vector<cl_uchar> bufferRef1(frameSize, 0);
std::vector<cl_uchar> bufferRef2(frameSize, 0);
if (!YUVGenerate(surfaceFormat, bufferRef0, width, height, 0, 90) ||
!YUVGenerate(surfaceFormat, bufferRef1, width, height, 91, 180) ||
!YUVGenerate(surfaceFormat, bufferRef2, width, height, 181, 255))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
//iterates through all devices
while (deviceWrapper->AdapterNext())
{
if (surfaceFormat != SURFACE_FORMAT_NV12 && !SurfaceFormatCheck(adapterType, *deviceWrapper, surfaceFormat))
{
std::string sharedHandleStr = (sharedHandle == SHARED_HANDLE_ENABLED)? "yes": "no";
std::string formatStr;
std::string adapterStr;
SurfaceFormatToString(surfaceFormat, formatStr);
AdapterToString(adapterType, adapterStr);
log_info("Skipping test case, image format is not supported by a device (adapter type: %s, format: %s, shared handle: %s)\n",
adapterStr.c_str(), formatStr.c_str(), sharedHandleStr.c_str());
return result.Result();
}
void *objectSharedHandle = 0;
std::auto_ptr<CSurfaceWrapper> surface;
//creates surface
if (!MediaSurfaceCreate(adapterType, width, height, surfaceFormat, *deviceWrapper, surface,
(sharedHandle == SHARED_HANDLE_ENABLED) ? true: false, &objectSharedHandle))
{
log_error("Media surface creation failed for %i adapter\n", deviceWrapper->AdapterIdx());
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
if (!YUVSurfaceSet(surfaceFormat, surface, bufferRef0, width, height))
{
result.ResultSub(CResult::TEST_ERROR);
return result.Result();
}
cl_context_properties contextProperties[] = {
CL_CONTEXT_PLATFORM, (cl_context_properties)gPlatformIDdetected,
AdapterTypeToContextInfo(adapterType), (cl_context_properties)deviceWrapper->Device(),
0,
};
cl_int error;
clContextWrapper ctx = clCreateContext(&contextProperties[0], 1, &gDeviceIDdetected, NULL, NULL, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateContext failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
clCommandQueueWrapper cmdQueue = clCreateCommandQueue(ctx, gDeviceIDdetected, 0, &error );
if (error != CL_SUCCESS)
{
log_error("Unable to create command queue: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
{ //memory access write
#if defined(_WIN32)
cl_dx9_surface_info_khr surfaceInfo;
surfaceInfo.resource = *(static_cast<CD3D9SurfaceWrapper *>(surface.get()));
surfaceInfo.shared_handle = objectSharedHandle;
#else
void *surfaceInfo = 0;
return TEST_NOT_IMPLEMENTED;
#endif
std::vector<cl_mem> memObjList;
unsigned int planesNum = PlanesNum(surfaceFormat);
std::vector<clMemWrapper> planesList(planesNum);
for (unsigned int planeIdx = 0; planeIdx < planesNum; ++planeIdx)
{
planesList[planeIdx] = clCreateFromDX9MediaSurfaceKHR(ctx, CL_MEM_WRITE_ONLY, adapterType, &surfaceInfo, planeIdx, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateFromDX9MediaSurfaceKHR failed for WRITE_ONLY plane %i: %s\n", planeIdx, IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
memObjList.push_back(planesList[planeIdx]);
}
error = clEnqueueAcquireDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueAcquireDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
size_t offset = 0;
size_t origin[3] = {0,0,0};
for (size_t i = 0; i < memObjList.size(); ++i)
{
size_t planeWidth = (i == 0) ? width: width / 2;
size_t planeHeight = (i == 0) ? height: height / 2;
size_t regionPlane[3] = {planeWidth, planeHeight, 1};
error = clEnqueueWriteImage(cmdQueue, memObjList[i], CL_TRUE, origin, regionPlane,
0, 0, &bufferRef1[offset], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueWriteImage failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
offset += planeWidth * planeHeight;
}
error = clEnqueueReleaseDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReleaseDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
}
std::vector<cl_uchar> bufferOut0(frameSize, 0);
if (!YUVSurfaceGet(surfaceFormat, surface, bufferOut0, width, height))
{
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVCompare(surfaceFormat, bufferOut0, bufferRef1, width, height))
{
log_error("Media surface is different than expected\n");
result.ResultSub(CResult::TEST_FAIL);
}
{ //memory access read
#if defined(_WIN32)
cl_dx9_surface_info_khr surfaceInfo;
surfaceInfo.resource = *(static_cast<CD3D9SurfaceWrapper *>(surface.get()));
surfaceInfo.shared_handle = objectSharedHandle;
#else
void *surfaceInfo = 0;
return TEST_NOT_IMPLEMENTED;
#endif
std::vector<cl_mem> memObjList;
unsigned int planesNum = PlanesNum(surfaceFormat);
std::vector<clMemWrapper> planesList(planesNum);
for (unsigned int planeIdx = 0; planeIdx < planesNum; ++planeIdx)
{
planesList[planeIdx] = clCreateFromDX9MediaSurfaceKHR(ctx, CL_MEM_READ_ONLY, adapterType, &surfaceInfo, planeIdx, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateFromDX9MediaSurfaceKHR failed for READ_ONLY plane %i: %s\n", planeIdx, IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
memObjList.push_back(planesList[planeIdx]);
}
error = clEnqueueAcquireDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueAcquireDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
std::vector<cl_uchar> out( frameSize, 0 );
size_t offset = 0;
size_t origin[3] = {0,0,0};
for (size_t i = 0; i < memObjList.size(); ++i)
{
size_t planeWidth = (i == 0) ? width: width / 2;
size_t planeHeight = (i == 0) ? height: height / 2;
size_t regionPlane[3] = {planeWidth, planeHeight, 1};
error = clEnqueueReadImage(cmdQueue, memObjList[i], CL_TRUE, origin, regionPlane, 0, 0,
&out[offset], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReadImage failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
offset += planeWidth * planeHeight;
}
if (!YUVCompare(surfaceFormat, out, bufferRef1, width, height))
{
log_error("OCL image (READ_ONLY) is different then expected\n");
result.ResultSub(CResult::TEST_FAIL);
}
error = clEnqueueReleaseDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReleaseDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
}
std::vector<cl_uchar> bufferOut1(frameSize, 0);
if (!YUVSurfaceGet(surfaceFormat, surface, bufferOut1, width, height))
{
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVCompare(surfaceFormat, bufferOut1, bufferRef1, width, height))
{
log_error("Media surface is different than expected\n");
result.ResultSub(CResult::TEST_FAIL);
}
{ //memory access read write
#if defined(_WIN32)
cl_dx9_surface_info_khr surfaceInfo;
surfaceInfo.resource = *(static_cast<CD3D9SurfaceWrapper *>(surface.get()));
surfaceInfo.shared_handle = objectSharedHandle;
#else
void *surfaceInfo = 0;
return TEST_NOT_IMPLEMENTED;
#endif
std::vector<cl_mem> memObjList;
unsigned int planesNum = PlanesNum(surfaceFormat);
std::vector<clMemWrapper> planesList(planesNum);
for (unsigned int planeIdx = 0; planeIdx < planesNum; ++planeIdx)
{
planesList[planeIdx] = clCreateFromDX9MediaSurfaceKHR(ctx, CL_MEM_READ_WRITE, adapterType, &surfaceInfo, planeIdx, &error);
if (error != CL_SUCCESS)
{
log_error("clCreateFromDX9MediaSurfaceKHR failed for READ_WRITE plane %i: %s\n", planeIdx, IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
memObjList.push_back(planesList[planeIdx]);
}
error = clEnqueueAcquireDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueAcquireDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
{ //read
std::vector<cl_uchar> out( frameSize, 0 );
size_t offset = 0;
size_t origin[3] = {0,0,0};
for (size_t i = 0; i < memObjList.size(); ++i)
{
size_t planeWidth = (i == 0) ? width: width / 2;
size_t planeHeight = (i == 0) ? height: height / 2;
size_t regionPlane[3] = {planeWidth, planeHeight, 1};
error = clEnqueueReadImage(cmdQueue, memObjList[i], CL_TRUE, origin, regionPlane, 0, 0,
&out[offset], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReadImage failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
offset += planeWidth * planeHeight;
}
if (!YUVCompare(surfaceFormat, out, bufferRef1, width, height))
{
log_error("OCL image (READ_WRITE) is different then expected\n");
result.ResultSub(CResult::TEST_FAIL);
}
}
{ //write
size_t offset = 0;
size_t origin[3] = {0,0,0};
for (size_t i = 0; i < memObjList.size(); ++i)
{
size_t planeWidth = (i == 0) ? width: width / 2;
size_t planeHeight = (i == 0) ? height: height / 2;
size_t regionPlane[3] = {planeWidth, planeHeight, 1};
error = clEnqueueWriteImage(cmdQueue, memObjList[i], CL_TRUE, origin, regionPlane,
0, 0, &bufferRef2[offset], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueWriteImage failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
offset += planeWidth * planeHeight;
}
}
error = clEnqueueReleaseDX9MediaSurfacesKHR(cmdQueue, static_cast<cl_uint>(memObjList.size()), &memObjList[0], 0, 0, 0);
if (error != CL_SUCCESS)
{
log_error("clEnqueueReleaseDX9MediaSurfacesKHR failed: %s\n", IGetErrorString(error));
result.ResultSub(CResult::TEST_FAIL);
}
}
std::vector<cl_uchar> bufferOut2(frameSize, 0);
if (!YUVSurfaceGet(surfaceFormat, surface, bufferOut2, width, height))
{
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
if (!YUVCompare(surfaceFormat, bufferOut2, bufferRef2, width, height))
{
log_error("Media surface is different than expected\n");
result.ResultSub(CResult::TEST_FAIL);
}
}
if (!deviceWrapper->Status())
{
std::string adapterName;
AdapterToString(adapterType, adapterName);
log_error("%s init failed\n", adapterName.c_str());
result.ResultSub(CResult::TEST_FAIL);
return result.Result();
}
return result.Result();
}
int test_memory_access(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
{
CResult result;
#if defined(_WIN32)
//D3D9
if(memory_access(deviceID, context, queue, num_elements, 256, 256, CL_ADAPTER_D3D9_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9, NV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(memory_access(deviceID, context, queue, num_elements, 512, 256, CL_ADAPTER_D3D9_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9, YV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
//D3D9EX
if(memory_access(deviceID, context, queue, num_elements, 256, 512, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9EX, NV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(memory_access(deviceID, context, queue, num_elements, 512, 256, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (D3D9EX, NV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(memory_access(deviceID, context, queue, num_elements, 256, 256, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (D3D9EX, YV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(memory_access(deviceID, context, queue, num_elements, 128, 128, CL_ADAPTER_D3D9EX_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (D3D9EX, YV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
//DXVA
if(memory_access(deviceID, context, queue, num_elements, 128, 128, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (DXVA, NV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(memory_access(deviceID, context, queue, num_elements, 64, 64, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_NV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (DXVA, NV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(memory_access(deviceID, context, queue, num_elements, 512, 512, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_DISABLED) != 0)
{
log_error("\nTest case (DXVA, YV12, no shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
if(memory_access(deviceID, context, queue, num_elements, 1024, 1024, CL_ADAPTER_DXVA_KHR,
SURFACE_FORMAT_YV12, SHARED_HANDLE_ENABLED) != 0)
{
log_error("\nTest case (DXVA, YV12, shared handle) failed\n\n");
result.ResultSub(CResult::TEST_FAIL);
}
#else
return TEST_NOT_IMPLEMENTED;
#endif
return result.Result();
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
@@ -13,159 +13,159 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
#ifndef __UTILS_KHR_MEDIA_H
#define __UTILS_KHR_MEDIA_H
#include "wrappers.h"
#include "CL/cl_dx9_media_sharing.h"
#include "../../test_common/harness/typeWrappers.h"
#include <iostream>
#include <string>
#include <memory>
#include <vector>
extern clGetDeviceIDsFromDX9MediaAdapterKHR_fn clGetDeviceIDsFromDX9MediaAdapterKHR;
extern clCreateFromDX9MediaSurfaceKHR_fn clCreateFromDX9MediaSurfaceKHR;
extern clEnqueueAcquireDX9MediaSurfacesKHR_fn clEnqueueAcquireDX9MediaSurfacesKHR;
extern clEnqueueReleaseDX9MediaSurfacesKHR_fn clEnqueueReleaseDX9MediaSurfacesKHR;
extern cl_platform_id gPlatformIDdetected;
extern cl_device_id gDeviceIDdetected;
extern cl_device_type gDeviceTypeSelected;
#define NL "\n"
#define TEST_NOT_IMPLEMENTED -1
#define TEST_NOT_SUPPORTED -2
enum TSurfaceFormat
{
SURFACE_FORMAT_NV12,
SURFACE_FORMAT_YV12,
SURFACE_FORMAT_R32F,
SURFACE_FORMAT_R16F,
SURFACE_FORMAT_L16,
SURFACE_FORMAT_A8,
SURFACE_FORMAT_L8,
SURFACE_FORMAT_G32R32F,
SURFACE_FORMAT_G16R16F,
SURFACE_FORMAT_G16R16,
SURFACE_FORMAT_A8L8,
SURFACE_FORMAT_A32B32G32R32F,
SURFACE_FORMAT_A16B16G16R16F,
SURFACE_FORMAT_A16B16G16R16,
SURFACE_FORMAT_A8B8G8R8,
SURFACE_FORMAT_X8B8G8R8,
SURFACE_FORMAT_A8R8G8B8,
SURFACE_FORMAT_X8R8G8B8,
};
enum TContextFuncType
{
CONTEXT_CREATE_DEFAULT,
CONTEXT_CREATE_FROM_TYPE,
};
enum TSharedHandleType
{
SHARED_HANDLE_ENABLED,
SHARED_HANDLE_DISABLED,
};
class CResult {
public:
enum TTestResult {
TEST_NORESULT,
TEST_NOTSUPPORTED,
TEST_PASS,
TEST_FAIL,
TEST_ERROR,
};
CResult();
~CResult();
void ResultSub(TTestResult result);
TTestResult ResultLast() const;
int Result() const;
private:
TTestResult _result;
TTestResult _resultLast;
};
bool ExtensionCheck(const std::string &extension, cl_device_id deviceID);
void FunctionContextCreateToString(TContextFuncType contextCreateFunction, std::string &contextFunction);
void AdapterToString(cl_dx9_media_adapter_type_khr adapterType, std::string &adapter);
cl_context_info AdapterTypeToContextInfo(cl_dx9_media_adapter_type_khr adapterType);
//YUV utils
void YUVGenerateNV12(std::vector<cl_uchar> &yuv, unsigned int width, unsigned int height,
cl_uchar valueMin, cl_uchar valueMax, double valueAdd = 0.0);
void YUVGenerateYV12(std::vector<cl_uchar> &yuv, unsigned int width, unsigned int height,
cl_uchar valueMin, cl_uchar valueMax, double valueAdd = 0.0);
bool YUVGenerate(TSurfaceFormat surfaceFormat, std::vector<cl_uchar> &yuv, unsigned int width, unsigned int height,
cl_uchar valueMin, cl_uchar valueMax, double valueAdd = 0.0);
bool YUVSurfaceSetNV12(std::auto_ptr<CSurfaceWrapper> &surface, const std::vector<cl_uchar> &yuv,
unsigned int width, unsigned int height);
bool YUVSurfaceSetYV12(std::auto_ptr<CSurfaceWrapper> &surface, const std::vector<cl_uchar> &yuv,
unsigned int width, unsigned int height);
bool YUVSurfaceSet(TSurfaceFormat surfaceFormat, std::auto_ptr<CSurfaceWrapper> &surface, const std::vector<cl_uchar> &yuv,
unsigned int width, unsigned int height);
bool YUVSurfaceGetNV12(std::auto_ptr<CSurfaceWrapper> &surface, std::vector<cl_uchar> &yuv,
unsigned int width, unsigned int height);
bool YUVSurfaceGetYV12(std::auto_ptr<CSurfaceWrapper> &surface, std::vector<cl_uchar> &yuv,
unsigned int width, unsigned int height);
bool YUVSurfaceGet(TSurfaceFormat surfaceFormat, std::auto_ptr<CSurfaceWrapper> &surface, std::vector<cl_uchar> &yuv,
unsigned int width, unsigned int height);
bool YUVCompareNV12(const std::vector<cl_uchar> &yuvTest, const std::vector<cl_uchar> &yuvRef,
unsigned int width, unsigned int height);
bool YUVCompareYV12(const std::vector<cl_uchar> &yuvTest, const std::vector<cl_uchar> &yuvRef,
unsigned int width, unsigned int height);
bool YUVCompare(TSurfaceFormat surfaceFormat, const std::vector<cl_uchar> &yuvTest, const std::vector<cl_uchar> &yuvRef,
unsigned int width, unsigned int height);
//other types utils
void DataGenerate(TSurfaceFormat surfaceFormat, cl_channel_type type, std::vector<float> &data, unsigned int width, unsigned int height,
unsigned int channelNum, float cmin = 0.0f, float cmax = 1.0f, float add = 0.0f);
void DataGenerate(TSurfaceFormat surfaceFormat, cl_channel_type type, std::vector<cl_half> &data, unsigned int width, unsigned int height,
unsigned int channelNum, float cmin = 0.0f, float cmax = 1.0f, float add = 0.0f);
void DataGenerate(TSurfaceFormat surfaceFormat, cl_channel_type type, std::vector<cl_uchar> &data, unsigned int width, unsigned int height,
unsigned int channelNum, float cmin = 0.0f, float cmax = 1.0f, float add = 0.0f);
bool DataCompare(TSurfaceFormat surfaceFormat, cl_channel_type type, const std::vector<cl_float> &dataTest, const std::vector<cl_float> &dataExp,
unsigned int width, unsigned int height, unsigned int channelNum);
bool DataCompare(TSurfaceFormat surfaceFormat, cl_channel_type type, const std::vector<cl_half> &dataTest, const std::vector<cl_half> &dataExp,
unsigned int width, unsigned int height, unsigned int channelNum);
bool DataCompare(TSurfaceFormat surfaceFormat, cl_channel_type type, const std::vector<cl_uchar> &dataTest, const std::vector<cl_uchar> &dataExp,
unsigned int width, unsigned int height, unsigned int channelNum);
bool GetImageInfo(cl_mem object, cl_image_format formatExp, size_t elementSizeExp,
size_t rowPitchExp, size_t slicePitchExp, size_t widthExp,
size_t heightExp, size_t depthExp, unsigned int planeExp);
bool GetMemObjInfo(cl_mem object, cl_dx9_media_adapter_type_khr adapterType, std::auto_ptr<CSurfaceWrapper> &surface, void *shareHandleExp);
bool ImageInfoVerify(cl_dx9_media_adapter_type_khr adapterType, const std::vector<cl_mem> &memObjList, unsigned int width, unsigned int height,
std::auto_ptr<CSurfaceWrapper> &surface, void *sharedHandle);
bool ImageFormatCheck(cl_context context, cl_mem_object_type imageType, const cl_image_format imageFormatCheck);
unsigned int ChannelNum(TSurfaceFormat surfaceFormat);
unsigned int PlanesNum(TSurfaceFormat surfaceFormat);
#if defined(_WIN32)
D3DFORMAT SurfaceFormatToD3D(TSurfaceFormat surfaceFormat);
#endif
bool DeviceCreate(cl_dx9_media_adapter_type_khr adapterType, std::auto_ptr<CDeviceWrapper> &device);
bool SurfaceFormatCheck(cl_dx9_media_adapter_type_khr adapterType, const CDeviceWrapper &device, TSurfaceFormat surfaceFormat);
bool SurfaceFormatToOCL(TSurfaceFormat surfaceFormat, cl_image_format &format);
void SurfaceFormatToString(TSurfaceFormat surfaceFormat, std::string &str );
bool MediaSurfaceCreate(cl_dx9_media_adapter_type_khr adapterType, unsigned int width, unsigned int height, TSurfaceFormat surfaceFormat,
CDeviceWrapper &device, std::auto_ptr<CSurfaceWrapper> &surface, bool sharedHandle, void **objectSharedHandle);
//imported from image helpers
cl_ushort float2half_rte( float f );
cl_ushort float2half_rtz( float f );
cl_ushort convert_float_to_half( float f );
float convert_half_to_float( unsigned short halfValue );
int DetectFloatToHalfRoundingMode( cl_command_queue );
#endif // __UTILS_KHR_MEDIA_H
#ifndef __UTILS_KHR_MEDIA_H
#define __UTILS_KHR_MEDIA_H
#include "wrappers.h"
#include "CL/cl_dx9_media_sharing.h"
#include "../../test_common/harness/typeWrappers.h"
#include <iostream>
#include <string>
#include <memory>
#include <vector>
extern clGetDeviceIDsFromDX9MediaAdapterKHR_fn clGetDeviceIDsFromDX9MediaAdapterKHR;
extern clCreateFromDX9MediaSurfaceKHR_fn clCreateFromDX9MediaSurfaceKHR;
extern clEnqueueAcquireDX9MediaSurfacesKHR_fn clEnqueueAcquireDX9MediaSurfacesKHR;
extern clEnqueueReleaseDX9MediaSurfacesKHR_fn clEnqueueReleaseDX9MediaSurfacesKHR;
extern cl_platform_id gPlatformIDdetected;
extern cl_device_id gDeviceIDdetected;
extern cl_device_type gDeviceTypeSelected;
#define NL "\n"
#define TEST_NOT_IMPLEMENTED -1
#define TEST_NOT_SUPPORTED -2
enum TSurfaceFormat
{
SURFACE_FORMAT_NV12,
SURFACE_FORMAT_YV12,
SURFACE_FORMAT_R32F,
SURFACE_FORMAT_R16F,
SURFACE_FORMAT_L16,
SURFACE_FORMAT_A8,
SURFACE_FORMAT_L8,
SURFACE_FORMAT_G32R32F,
SURFACE_FORMAT_G16R16F,
SURFACE_FORMAT_G16R16,
SURFACE_FORMAT_A8L8,
SURFACE_FORMAT_A32B32G32R32F,
SURFACE_FORMAT_A16B16G16R16F,
SURFACE_FORMAT_A16B16G16R16,
SURFACE_FORMAT_A8B8G8R8,
SURFACE_FORMAT_X8B8G8R8,
SURFACE_FORMAT_A8R8G8B8,
SURFACE_FORMAT_X8R8G8B8,
};
enum TContextFuncType
{
CONTEXT_CREATE_DEFAULT,
CONTEXT_CREATE_FROM_TYPE,
};
enum TSharedHandleType
{
SHARED_HANDLE_ENABLED,
SHARED_HANDLE_DISABLED,
};
class CResult {
public:
enum TTestResult {
TEST_NORESULT,
TEST_NOTSUPPORTED,
TEST_PASS,
TEST_FAIL,
TEST_ERROR,
};
CResult();
~CResult();
void ResultSub(TTestResult result);
TTestResult ResultLast() const;
int Result() const;
private:
TTestResult _result;
TTestResult _resultLast;
};
bool ExtensionCheck(const std::string &extension, cl_device_id deviceID);
void FunctionContextCreateToString(TContextFuncType contextCreateFunction, std::string &contextFunction);
void AdapterToString(cl_dx9_media_adapter_type_khr adapterType, std::string &adapter);
cl_context_info AdapterTypeToContextInfo(cl_dx9_media_adapter_type_khr adapterType);
//YUV utils
void YUVGenerateNV12(std::vector<cl_uchar> &yuv, unsigned int width, unsigned int height,
cl_uchar valueMin, cl_uchar valueMax, double valueAdd = 0.0);
void YUVGenerateYV12(std::vector<cl_uchar> &yuv, unsigned int width, unsigned int height,
cl_uchar valueMin, cl_uchar valueMax, double valueAdd = 0.0);
bool YUVGenerate(TSurfaceFormat surfaceFormat, std::vector<cl_uchar> &yuv, unsigned int width, unsigned int height,
cl_uchar valueMin, cl_uchar valueMax, double valueAdd = 0.0);
bool YUVSurfaceSetNV12(std::auto_ptr<CSurfaceWrapper> &surface, const std::vector<cl_uchar> &yuv,
unsigned int width, unsigned int height);
bool YUVSurfaceSetYV12(std::auto_ptr<CSurfaceWrapper> &surface, const std::vector<cl_uchar> &yuv,
unsigned int width, unsigned int height);
bool YUVSurfaceSet(TSurfaceFormat surfaceFormat, std::auto_ptr<CSurfaceWrapper> &surface, const std::vector<cl_uchar> &yuv,
unsigned int width, unsigned int height);
bool YUVSurfaceGetNV12(std::auto_ptr<CSurfaceWrapper> &surface, std::vector<cl_uchar> &yuv,
unsigned int width, unsigned int height);
bool YUVSurfaceGetYV12(std::auto_ptr<CSurfaceWrapper> &surface, std::vector<cl_uchar> &yuv,
unsigned int width, unsigned int height);
bool YUVSurfaceGet(TSurfaceFormat surfaceFormat, std::auto_ptr<CSurfaceWrapper> &surface, std::vector<cl_uchar> &yuv,
unsigned int width, unsigned int height);
bool YUVCompareNV12(const std::vector<cl_uchar> &yuvTest, const std::vector<cl_uchar> &yuvRef,
unsigned int width, unsigned int height);
bool YUVCompareYV12(const std::vector<cl_uchar> &yuvTest, const std::vector<cl_uchar> &yuvRef,
unsigned int width, unsigned int height);
bool YUVCompare(TSurfaceFormat surfaceFormat, const std::vector<cl_uchar> &yuvTest, const std::vector<cl_uchar> &yuvRef,
unsigned int width, unsigned int height);
//other types utils
void DataGenerate(TSurfaceFormat surfaceFormat, cl_channel_type type, std::vector<float> &data, unsigned int width, unsigned int height,
unsigned int channelNum, float cmin = 0.0f, float cmax = 1.0f, float add = 0.0f);
void DataGenerate(TSurfaceFormat surfaceFormat, cl_channel_type type, std::vector<cl_half> &data, unsigned int width, unsigned int height,
unsigned int channelNum, float cmin = 0.0f, float cmax = 1.0f, float add = 0.0f);
void DataGenerate(TSurfaceFormat surfaceFormat, cl_channel_type type, std::vector<cl_uchar> &data, unsigned int width, unsigned int height,
unsigned int channelNum, float cmin = 0.0f, float cmax = 1.0f, float add = 0.0f);
bool DataCompare(TSurfaceFormat surfaceFormat, cl_channel_type type, const std::vector<cl_float> &dataTest, const std::vector<cl_float> &dataExp,
unsigned int width, unsigned int height, unsigned int channelNum);
bool DataCompare(TSurfaceFormat surfaceFormat, cl_channel_type type, const std::vector<cl_half> &dataTest, const std::vector<cl_half> &dataExp,
unsigned int width, unsigned int height, unsigned int channelNum);
bool DataCompare(TSurfaceFormat surfaceFormat, cl_channel_type type, const std::vector<cl_uchar> &dataTest, const std::vector<cl_uchar> &dataExp,
unsigned int width, unsigned int height, unsigned int channelNum);
bool GetImageInfo(cl_mem object, cl_image_format formatExp, size_t elementSizeExp,
size_t rowPitchExp, size_t slicePitchExp, size_t widthExp,
size_t heightExp, size_t depthExp, unsigned int planeExp);
bool GetMemObjInfo(cl_mem object, cl_dx9_media_adapter_type_khr adapterType, std::auto_ptr<CSurfaceWrapper> &surface, void *shareHandleExp);
bool ImageInfoVerify(cl_dx9_media_adapter_type_khr adapterType, const std::vector<cl_mem> &memObjList, unsigned int width, unsigned int height,
std::auto_ptr<CSurfaceWrapper> &surface, void *sharedHandle);
bool ImageFormatCheck(cl_context context, cl_mem_object_type imageType, const cl_image_format imageFormatCheck);
unsigned int ChannelNum(TSurfaceFormat surfaceFormat);
unsigned int PlanesNum(TSurfaceFormat surfaceFormat);
#if defined(_WIN32)
D3DFORMAT SurfaceFormatToD3D(TSurfaceFormat surfaceFormat);
#endif
bool DeviceCreate(cl_dx9_media_adapter_type_khr adapterType, std::auto_ptr<CDeviceWrapper> &device);
bool SurfaceFormatCheck(cl_dx9_media_adapter_type_khr adapterType, const CDeviceWrapper &device, TSurfaceFormat surfaceFormat);
bool SurfaceFormatToOCL(TSurfaceFormat surfaceFormat, cl_image_format &format);
void SurfaceFormatToString(TSurfaceFormat surfaceFormat, std::string &str );
bool MediaSurfaceCreate(cl_dx9_media_adapter_type_khr adapterType, unsigned int width, unsigned int height, TSurfaceFormat surfaceFormat,
CDeviceWrapper &device, std::auto_ptr<CSurfaceWrapper> &surface, bool sharedHandle, void **objectSharedHandle);
//imported from image helpers
cl_ushort float2half_rte( float f );
cl_ushort float2half_rtz( float f );
cl_ushort convert_float_to_half( float f );
float convert_half_to_float( unsigned short halfValue );
int DetectFloatToHalfRoundingMode( cl_command_queue );
#endif // __UTILS_KHR_MEDIA_H

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
@@ -13,157 +13,157 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
#ifndef __WRAPPERS_H
#define __WRAPPERS_H
#if defined(_WIN32)
#include <d3d9.h>
#include <dxvahd.h>
#endif
class CDeviceWrapper {
public:
enum TAccelerationType
{
ACCELERATION_HW,
ACCELERATION_SW,
};
CDeviceWrapper();
virtual ~CDeviceWrapper();
virtual bool AdapterNext() = 0;
virtual unsigned int AdapterIdx() const = 0;
virtual void *Device() const = 0;
virtual bool Status() const = 0;
virtual void *D3D() const = 0;
#if defined(_WIN32)
HWND WindowHandle() const;
#endif
int WindowWidth() const;
int WindowHeight() const;
void WindowInit();
static TAccelerationType AccelerationType();
static void AccelerationType(TAccelerationType accelerationTypeNew);
private:
static const char *WINDOW_TITLE;
static const int WINDOW_WIDTH;
static const int WINDOW_HEIGHT;
static TAccelerationType accelerationType;
#if defined(_WIN32)
HMODULE _hInstance;
HWND _hWnd;
#endif
void WindowDestroy();
};
class CSurfaceWrapper
{
public:
CSurfaceWrapper();
virtual ~CSurfaceWrapper();
};
#if defined(_WIN32)
//windows specific wrappers
class CD3D9Wrapper: public CDeviceWrapper {
public:
CD3D9Wrapper();
~CD3D9Wrapper();
virtual bool AdapterNext();
virtual unsigned int AdapterIdx() const;
virtual void *Device() const;
virtual bool Status() const;
virtual void *D3D() const;
private:
LPDIRECT3D9 _d3d9;
LPDIRECT3DDEVICE9 _d3dDevice;
D3DDISPLAYMODE _d3ddm;
D3DADAPTER_IDENTIFIER9 _adapter;
bool _status;
unsigned int _adapterIdx;
bool _adapterFound;
D3DFORMAT Format();
D3DADAPTER_IDENTIFIER9 Adapter();
bool Init();
void Destroy();
};
class CD3D9ExWrapper: public CDeviceWrapper {
public:
CD3D9ExWrapper();
~CD3D9ExWrapper();
virtual bool AdapterNext();
virtual unsigned int AdapterIdx() const;
virtual void *Device() const;
virtual bool Status() const;
virtual void *D3D() const;
private:
LPDIRECT3D9EX _d3d9Ex;
LPDIRECT3DDEVICE9EX _d3dDeviceEx;
D3DDISPLAYMODEEX _d3ddmEx;
D3DADAPTER_IDENTIFIER9 _adapter;
bool _status;
unsigned int _adapterIdx;
bool _adapterFound;
D3DFORMAT Format();
D3DADAPTER_IDENTIFIER9 Adapter();
bool Init();
void Destroy();
};
class CDXVAWrapper: public CDeviceWrapper {
public:
CDXVAWrapper();
~CDXVAWrapper();
virtual bool AdapterNext();
virtual unsigned int AdapterIdx() const;
virtual void *Device() const;
virtual bool Status() const;
virtual void *D3D() const;
const CD3D9ExWrapper &D3D9() const;
private:
CD3D9ExWrapper _d3d9;
IDXVAHD_Device *_dxvaDevice;
bool _status;
bool _adapterFound;
static const D3DFORMAT RENDER_TARGET_FORMAT;
static const D3DFORMAT VIDEO_FORMAT;
static const unsigned int VIDEO_FPS;
bool DXVAHDInit();
void DXVAHDDestroy();
};
class CD3D9SurfaceWrapper: public CSurfaceWrapper
{
public:
CD3D9SurfaceWrapper();
CD3D9SurfaceWrapper( IDirect3DSurface9* mem );
~CD3D9SurfaceWrapper();
operator IDirect3DSurface9*() { return mMem; }
IDirect3DSurface9* * operator&() { return &mMem; }
IDirect3DSurface9* operator->() const { return mMem; }
private:
IDirect3DSurface9* mMem;
};
#endif
#endif // __D3D_WRAPPERS
#ifndef __WRAPPERS_H
#define __WRAPPERS_H
#if defined(_WIN32)
#include <d3d9.h>
#include <dxvahd.h>
#endif
class CDeviceWrapper {
public:
enum TAccelerationType
{
ACCELERATION_HW,
ACCELERATION_SW,
};
CDeviceWrapper();
virtual ~CDeviceWrapper();
virtual bool AdapterNext() = 0;
virtual unsigned int AdapterIdx() const = 0;
virtual void *Device() const = 0;
virtual bool Status() const = 0;
virtual void *D3D() const = 0;
#if defined(_WIN32)
HWND WindowHandle() const;
#endif
int WindowWidth() const;
int WindowHeight() const;
void WindowInit();
static TAccelerationType AccelerationType();
static void AccelerationType(TAccelerationType accelerationTypeNew);
private:
static const char *WINDOW_TITLE;
static const int WINDOW_WIDTH;
static const int WINDOW_HEIGHT;
static TAccelerationType accelerationType;
#if defined(_WIN32)
HMODULE _hInstance;
HWND _hWnd;
#endif
void WindowDestroy();
};
class CSurfaceWrapper
{
public:
CSurfaceWrapper();
virtual ~CSurfaceWrapper();
};
#if defined(_WIN32)
//windows specific wrappers
class CD3D9Wrapper: public CDeviceWrapper {
public:
CD3D9Wrapper();
~CD3D9Wrapper();
virtual bool AdapterNext();
virtual unsigned int AdapterIdx() const;
virtual void *Device() const;
virtual bool Status() const;
virtual void *D3D() const;
private:
LPDIRECT3D9 _d3d9;
LPDIRECT3DDEVICE9 _d3dDevice;
D3DDISPLAYMODE _d3ddm;
D3DADAPTER_IDENTIFIER9 _adapter;
bool _status;
unsigned int _adapterIdx;
bool _adapterFound;
D3DFORMAT Format();
D3DADAPTER_IDENTIFIER9 Adapter();
bool Init();
void Destroy();
};
class CD3D9ExWrapper: public CDeviceWrapper {
public:
CD3D9ExWrapper();
~CD3D9ExWrapper();
virtual bool AdapterNext();
virtual unsigned int AdapterIdx() const;
virtual void *Device() const;
virtual bool Status() const;
virtual void *D3D() const;
private:
LPDIRECT3D9EX _d3d9Ex;
LPDIRECT3DDEVICE9EX _d3dDeviceEx;
D3DDISPLAYMODEEX _d3ddmEx;
D3DADAPTER_IDENTIFIER9 _adapter;
bool _status;
unsigned int _adapterIdx;
bool _adapterFound;
D3DFORMAT Format();
D3DADAPTER_IDENTIFIER9 Adapter();
bool Init();
void Destroy();
};
class CDXVAWrapper: public CDeviceWrapper {
public:
CDXVAWrapper();
~CDXVAWrapper();
virtual bool AdapterNext();
virtual unsigned int AdapterIdx() const;
virtual void *Device() const;
virtual bool Status() const;
virtual void *D3D() const;
const CD3D9ExWrapper &D3D9() const;
private:
CD3D9ExWrapper _d3d9;
IDXVAHD_Device *_dxvaDevice;
bool _status;
bool _adapterFound;
static const D3DFORMAT RENDER_TARGET_FORMAT;
static const D3DFORMAT VIDEO_FORMAT;
static const unsigned int VIDEO_FPS;
bool DXVAHDInit();
void DXVAHDDestroy();
};
class CD3D9SurfaceWrapper: public CSurfaceWrapper
{
public:
CD3D9SurfaceWrapper();
CD3D9SurfaceWrapper( IDirect3DSurface9* mem );
~CD3D9SurfaceWrapper();
operator IDirect3DSurface9*() { return mMem; }
IDirect3DSurface9* * operator&() { return &mMem; }
IDirect3DSurface9* operator->() const { return mMem; }
private:
IDirect3DSurface9* mMem;
};
#endif
#endif // __D3D_WRAPPERS