SWDEV-301289 - Add missing sources files needed for ocltst on Windows

Change-Id: Icf96028f7891781e4ce1a7d425ff8d41e2602ffd


[ROCm/clr commit: 35ee5f675c]
このコミットが含まれているのは:
Vladislav Sytchenko
2021-08-30 13:58:34 -04:00
コミット 2c01580468
5個のファイルの変更634行の追加0行の削除
+330
ファイルの表示
@@ -0,0 +1,330 @@
/* Copyright (c) 2010 - 2021 Advanced Micro Devices, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. */
#include <windows.h>
#define CL_USE_DEPRECATED_OPENCL_2_0_APIS 1
#include "CL/cl.hpp"
SERVICE_STATUS serviceStatus = {0};
SERVICE_STATUS_HANDLE serviceStatusHandle = 0;
const wchar_t* CrossProcessEventName = L"Global\\OpenCL_Test_serviceEvent";
const wchar_t* successMessage = L"OpenCL Service Test Success\n";
const wchar_t* serviceName = L"OpenCL Test service";
// this event is set whenever the service thread is finished executing
// all it's tasks
HANDLE RetireServiceEvent = 0;
DWORD WINAPI ThreadProc(LPVOID lpdwThreadParam);
//////////////////////////
// log relate functions //
//////////////////////////
void getLogFileName(wchar_t fileName[MAX_PATH]) {
DWORD dwSize = GetModuleFileNameW(NULL, fileName, MAX_PATH);
wchar_t* p = fileName + dwSize;
while (*p != '\\' && p > fileName) p--;
p++;
wcscpy(p, L"result.txt");
}
VOID WriteLog(const wchar_t* pMsg) {
static wchar_t fileName[MAX_PATH] = {0};
if (fileName[0] == 0) getLogFileName(fileName);
FILE* pLog = _wfopen(fileName, L"w");
if (NULL != pLog) {
fwprintf(pLog, pMsg);
fclose(pLog);
}
}
VOID AppendLog(const wchar_t* pMsg) {
static wchar_t fileName[MAX_PATH] = {0};
if (fileName[0] == 0) getLogFileName(fileName);
FILE* pLog = _wfopen(fileName, L"a");
if (NULL != pLog) {
fwprintf(pLog, pMsg);
fclose(pLog);
}
}
VOID AppendLog(const char* pMsg) {
static wchar_t fileName[MAX_PATH] = {0};
if (fileName[0] == 0) getLogFileName(fileName);
FILE* pLog = _wfopen(fileName, L"a");
if (NULL != pLog) {
fprintf(pLog, pMsg);
fclose(pLog);
}
}
///////////////////////////////
// service related functions //
///////////////////////////////
void WINAPI ServiceControlHandler(DWORD controlCode) {
switch (controlCode) {
case SERVICE_CONTROL_INTERROGATE:
break;
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
if (!SetServiceStatus(serviceStatusHandle, &serviceStatus))
AppendLog(L"SetServiceStatus SERVICE_STOP_PENDING failed\n");
if (RetireServiceEvent) SetEvent(RetireServiceEvent);
return;
case SERVICE_CONTROL_PAUSE:
break;
case SERVICE_CONTROL_CONTINUE:
break;
default:
if (controlCode >= 128 && controlCode <= 255)
// user defined control code
break;
else
// unrecognised control code
break;
}
if (!SetServiceStatus(serviceStatusHandle, &serviceStatus))
AppendLog(L"SetServiceStatus SERVICE_STOP_PENDING failed\n");
}
void WINAPI ServiceMain(DWORD /*argc*/, wchar_t* /*argv*/[]) {
// initialise service status
serviceStatus.dwServiceType = SERVICE_WIN32;
serviceStatus.dwCurrentState = SERVICE_START_PENDING;
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN;
serviceStatus.dwWin32ExitCode = NO_ERROR;
serviceStatus.dwServiceSpecificExitCode = NO_ERROR;
serviceStatus.dwCheckPoint = 0;
serviceStatus.dwWaitHint = 0;
serviceStatusHandle =
RegisterServiceCtrlHandlerW(serviceName, ServiceControlHandler);
if (serviceStatusHandle) {
// service is starting
serviceStatus.dwCurrentState = SERVICE_START_PENDING;
if (!SetServiceStatus(serviceStatusHandle, &serviceStatus))
AppendLog(L"SetServiceStatus SERVICE_START_PENDING failed\n");
// do initialisation here
RetireServiceEvent = CreateEvent(0, FALSE, FALSE, 0);
// running
serviceStatus.dwControlsAccepted |=
(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
serviceStatus.dwCurrentState = SERVICE_RUNNING;
if (!SetServiceStatus(serviceStatusHandle, &serviceStatus))
AppendLog(L"SetServiceStatus SERVICE_RUNNING failed\n");
// Create the thread that actually does the CL testing
CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
// wait for the thread to finish
WaitForSingleObject(RetireServiceEvent, 60000);
HANDLE crossProcessEvent =
OpenEventW(EVENT_ALL_ACCESS, FALSE, CrossProcessEventName);
if (NULL != crossProcessEvent) {
SetEvent(crossProcessEvent);
} else {
AppendLog(L"cross process Event could not be openned\n");
}
// service was stopped
serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
if (!SetServiceStatus(serviceStatusHandle, &serviceStatus))
AppendLog(L"SetServiceStatus SERVICE_STOP_PENDING failed\n");
// do cleanup here
CloseHandle(crossProcessEvent);
CloseHandle(RetireServiceEvent);
RetireServiceEvent = 0;
// service is now stopped
serviceStatus.dwControlsAccepted &=
~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
serviceStatus.dwCurrentState = SERVICE_STOPPED;
if (!SetServiceStatus(serviceStatusHandle, &serviceStatus))
AppendLog(L"SetServiceStatus SERVICE_STOPPED failed\n");
}
}
// This function services ocltst as a service when launched
// by the OS. It registers the service routines.
void serviceStubCall() {
wchar_t serviceName[MAX_PATH];
wcscpy(serviceName, ::serviceName);
SERVICE_TABLE_ENTRYW serviceTable[] = {{serviceName, ServiceMain}, {0, 0}};
DWORD session_id;
BOOL retVal = ProcessIdToSessionId(GetCurrentProcessId(), &session_id);
if (0 == session_id) {
StartServiceCtrlDispatcherW(serviceTable);
}
}
/////////////////////
// CL related code //
/////////////////////
const char c_kernelCode[] =
" __kernel void hello(__global char * theArray)"
"{"
" size_t i = get_global_id(0);"
"if ( i < get_global_size(0))"
"theArray[i] = 78;"
"}";
const unsigned int c_bufferSize = 1024;
DWORD WINAPI ThreadProc(LPVOID lpdwThreadParam) {
cl_int err;
// Platform info
std::vector<cl::Platform> platforms;
err = cl::Platform::get(&platforms);
if (err != CL_SUCCESS) {
AppendLog(L"Platform::get() failed\n");
return -1;
}
std::vector<cl::Platform>::iterator i;
if (platforms.size() > 0) {
for (i = platforms.begin(); i != platforms.end(); ++i) {
if (!strcmp((*i).getInfo<CL_PLATFORM_VENDOR>(&err).c_str(),
"Advanced Micro Devices, Inc.")) {
break;
}
}
}
if (err != CL_SUCCESS) {
AppendLog(L"Platform::getInfo() failed \n");
return -1;
}
cl_context_properties cps[3] = {CL_CONTEXT_PLATFORM,
(cl_context_properties)(*i)(), 0};
cl::Context context(CL_DEVICE_TYPE_GPU, cps, NULL, NULL, &err);
if (err != CL_SUCCESS) {
AppendLog(L"Context::Context() failed \n");
return -1;
}
std::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();
if (err != CL_SUCCESS) {
AppendLog(L"Context::getInfo() failed \n");
return -1;
}
if (devices.size() == 0) {
AppendLog(L"No device available\n");
return -1;
}
cl::Program::Sources sources(
1, std::make_pair(c_kernelCode, sizeof(c_kernelCode)));
cl::Program program = cl::Program(context, sources, &err);
if (err != CL_SUCCESS) {
AppendLog(L"Program::Program() failed\n");
}
err = program.build(devices);
if (err != CL_SUCCESS) {
if (err == CL_BUILD_PROGRAM_FAILURE) {
std::string str(
(char*)program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(devices[0])
.c_str());
AppendLog(L" \n\t\t\tBUILD LOG\n\n");
AppendLog(L" ************************************************\n");
AppendLog(str.c_str());
AppendLog(L" ************************************************\n");
}
AppendLog(L"Program::build() failed\n");
return -1;
}
cl::Kernel kernel(program, "hello", &err);
if (err != CL_SUCCESS) {
AppendLog(L"Kernel::Kernel() failed\n");
return -1;
}
cl::Buffer buffer =
cl::Buffer(context, CL_MEM_READ_WRITE, c_bufferSize, 0, &err);
if (err != CL_SUCCESS) {
AppendLog(L"Kernel::setArg() failed \n");
}
cl::CommandQueue queue(context, devices[0], 0, &err);
if (err != CL_SUCCESS) {
AppendLog(L"CommandQueue::CommandQueue() failed \n");
return -1;
}
err = kernel.setArg(0, buffer);
if (err != CL_SUCCESS) {
AppendLog(L"Kernel::setArg() failed \n");
return -1;
}
err = queue.enqueueNDRangeKernel(kernel, cl::NullRange,
cl::NDRange(c_bufferSize), cl::NullRange);
if (err != CL_SUCCESS) {
AppendLog(L"CommandQueue::enqueueNDRangeKernel()\n");
return -1;
}
err = queue.finish();
if (err != CL_SUCCESS) {
AppendLog(L"Event::wait() failed \n");
}
char* ptr = (char*)malloc(c_bufferSize);
err = queue.enqueueReadBuffer(buffer, CL_TRUE, 0, c_bufferSize, ptr, NULL,
NULL);
if (err != CL_SUCCESS) {
AppendLog(L"CommandQueue::enqueueReadBuffer()\n");
return -1;
}
bool validateSuccess = true;
// validate the results
for (int i = 0; i < c_bufferSize; i++) {
if (ptr[i] != 78) validateSuccess = false;
}
free(ptr);
if (validateSuccess) {
WriteLog(successMessage);
AppendLog(L"validate success");
} else {
AppendLog(L"Validate fail");
return -1;
}
SetEvent(RetireServiceEvent);
return 0;
}
+48
ファイルの表示
@@ -0,0 +1,48 @@
/* Copyright (c) 2010 - 2021 Advanced Micro Devices, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. */
#include "getopt.h"
#include <string.h>
char *optarg = nullptr;
int optind = 1;
int getopt(int argc, char *const argv[], const char *optstring) {
if ((optind >= argc) || (argv[optind][0] != '-') || (argv[optind][0] == 0)) {
return -1;
}
int opt = argv[optind][1];
const char *p = strchr(optstring, opt);
if (p == nullptr) {
return '?';
}
if (p[1] == ':') {
optind++;
if (optind >= argc) {
return '?';
}
optarg = argv[optind];
optind++;
}
return opt;
}
+26
ファイルの表示
@@ -0,0 +1,26 @@
/* Copyright (c) 2010 - 2021 Advanced Micro Devices, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. */
#pragma once
extern char *optarg;
extern int optind;
extern "C" int getopt(int argc, char *const argv[], const char *optstring);
+175
ファイルの表示
@@ -0,0 +1,175 @@
/* Copyright (c) 2010 - 2021 Advanced Micro Devices, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. */
#ifdef ATI_OS_WIN
#include <assert.h>
#include <stdio.h>
#include <windows.h>
#include "Window.h"
HWND Window::_hWnd;
unsigned char* Window::_data;
unsigned int Window::_w;
unsigned int Window::_h;
void Window::OnPaint(void) {
PAINTSTRUCT ps;
HDC hDC = BeginPaint(_hWnd, &ps);
if (_w && _h && _data) {
BITMAPINFO bm;
bm.bmiColors[0].rgbBlue = 0;
bm.bmiColors[0].rgbGreen = 0;
bm.bmiColors[0].rgbRed = 0;
bm.bmiColors[0].rgbReserved = 0;
bm.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bm.bmiHeader.biWidth = _w;
bm.bmiHeader.biHeight = _h;
bm.bmiHeader.biPlanes = 1;
bm.bmiHeader.biBitCount = 32;
bm.bmiHeader.biCompression = BI_RGB;
bm.bmiHeader.biSizeImage = 0;
bm.bmiHeader.biXPelsPerMeter = 0;
bm.bmiHeader.biYPelsPerMeter = 0;
bm.bmiHeader.biClrUsed = 0;
bm.bmiHeader.biClrImportant = 0;
int ret = SetDIBitsToDevice(hDC, 0, 0, _w, _h, 0, 0, 0, _h, _data, &bm,
DIB_RGB_COLORS);
assert(ret);
}
EndPaint(_hWnd, &ps);
}
/*****************************************************************************
*****************************************************************************/
LRESULT WINAPI Window::DefWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam) {
switch (uMsg) {
case WM_CHAR:
switch (wParam) {
case 27: // ESC
exit(0);
break;
}
return 0;
case WM_PAINT:
OnPaint();
return 0;
}
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Window::Window(const char* title, int x, int y, int width, int height,
unsigned int uiStyle) {
_data = NULL;
_w = 0;
_h = 0;
WNDCLASS wc = {0,
(WNDPROC)Window::DefWindowProc,
0,
0,
GetModuleHandle(0),
LoadIcon(NULL, IDI_WINLOGO),
LoadCursor(NULL, IDC_ARROW),
NULL,
NULL,
"TST"};
if (!RegisterClass(&wc)) {
MessageBox(NULL, "RegisterClass() failed", "Error", MB_OK);
exit(0);
}
if (uiStyle == 0) {
uiStyle = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
}
RECT r = {x, y, x + width, y + height};
AdjustWindowRect(&r, uiStyle, 0);
_hWnd = CreateWindow("TST", title, uiStyle, r.left, r.top, r.right - r.left,
r.bottom - r.top, NULL, NULL, GetModuleHandle(0), this);
if (_hWnd == NULL) {
MessageBox(NULL, "CreateWindow() failed.", "Error", MB_OK);
exit(0);
}
ShowWindow(_hWnd, SW_SHOW);
UpdateWindow(_hWnd);
}
Window::~Window(void) {
DestroyWindow(_hWnd);
if (_data) {
delete[] _data;
}
UnregisterClass("TST", GetModuleHandle(NULL));
}
void Window::ConsumeEvents(void) {
while (1) {
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
void Window::ShowImage(unsigned int width, unsigned int height, float* data) {
if (_data) {
delete[] _data;
}
_data = new unsigned char[4 * width * height];
_w = width;
_h = height;
unsigned char* pb = _data;
float* p = data;
unsigned int i;
for (i = 0; i < (unsigned int)(width * height); i++) {
//
// argb
//
float v = p[2] > 1.f ? 1.f : (p[2] < 0.f ? 0.f : p[2]);
*pb++ = (unsigned char)(255.f * v);
v = p[1] > 1.f ? 1.f : (p[1] < 0.f ? 0.f : p[1]);
*pb++ = (unsigned char)(255.f * v);
v = p[0] > 1.f ? 1.f : (p[0] < 0.f ? 0.f : p[0]);
*pb++ = (unsigned char)(255.f * v);
v = p[3] > 1.f ? 1.f : (p[3] < 0.f ? 0.f : p[3]);
*pb++ = (unsigned char)(255.f * v);
p += 4;
}
RedrawWindow(_hWnd, NULL, NULL, RDW_INVALIDATE);
OnPaint();
}
#endif // ATI_OS_WIN
+55
ファイルの表示
@@ -0,0 +1,55 @@
/* Copyright (c) 2010 - 2021 Advanced Micro Devices, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. */
#ifndef _WINDOW_H_
#define _WINDOW_H_
#ifdef ATI_OS_WIN
#include <gl\gl.h>
#include <windows.h>
class Window {
public:
typedef LRESULT (*WindowProc)(HWND hW, UINT uMsg, WPARAM wP, LPARAM lP);
public:
Window(const char* title, int x, int y, int width, int height,
unsigned int uiStyle);
~Window();
void ConsumeEvents(void);
void ShowImage(unsigned int width, unsigned int height, float* data);
private:
static LRESULT WINAPI DefWindowProc(HWND hW, UINT uMsg, WPARAM wP, LPARAM lP);
static void OnPaint(void);
public:
static HWND _hWnd;
static unsigned char* _data;
static unsigned int _w;
static unsigned int _h;
};
#endif // ATI_OS_WIN
#endif // _WINDOW_H_