mirror of
https://github.com/NVIDIA/cuda-samples.git
synced 2024-12-01 11:19:17 +08:00
153 lines
5.8 KiB
C++
Executable File
153 lines
5.8 KiB
C++
Executable File
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
/*Includes code from DirectX-Graphics-Samples/Samples/Desktop/D3D12HelloWorld/src/HelloTexture,
|
|
which is licensed as follows:
|
|
|
|
The MIT License (MIT)
|
|
Copyright (c) 2015 Microsoft
|
|
|
|
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 "stdafx.h"
|
|
#include "Win32Application.h"
|
|
|
|
HWND Win32Application::m_hwnd = nullptr;
|
|
|
|
int Win32Application::Run(DX12CudaSample* pSample, HINSTANCE hInstance,
|
|
int nCmdShow) {
|
|
// Parse the command line parameters
|
|
int argc;
|
|
LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc);
|
|
pSample->ParseCommandLineArgs(argv, argc);
|
|
LocalFree(argv);
|
|
|
|
// Initialize the window class.
|
|
WNDCLASSEX windowClass = {0};
|
|
windowClass.cbSize = sizeof(WNDCLASSEX);
|
|
windowClass.style = CS_HREDRAW | CS_VREDRAW;
|
|
windowClass.lpfnWndProc = WindowProc;
|
|
windowClass.hInstance = hInstance;
|
|
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
windowClass.lpszClassName = "DX12CudaSampleClass";
|
|
RegisterClassEx(&windowClass);
|
|
|
|
RECT windowRect = {0, 0, static_cast<LONG>(pSample->GetWidth()),
|
|
static_cast<LONG>(pSample->GetHeight())};
|
|
AdjustWindowRect(&windowRect, WS_OVERLAPPEDWINDOW, FALSE);
|
|
|
|
// Create the window and store a handle to it.
|
|
m_hwnd = CreateWindow(windowClass.lpszClassName, pSample->GetTitle(),
|
|
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
|
|
windowRect.right - windowRect.left,
|
|
windowRect.bottom - windowRect.top,
|
|
nullptr, // We have no parent window.
|
|
nullptr, // We aren't using menus.
|
|
hInstance, pSample);
|
|
|
|
// Initialize the sample. OnInit is defined in each child-implementation of
|
|
// DXSample.
|
|
pSample->OnInit();
|
|
|
|
ShowWindow(m_hwnd, nCmdShow);
|
|
|
|
// Main sample loop.
|
|
MSG msg = {};
|
|
while (msg.message != WM_QUIT) {
|
|
// Process any messages in the queue.
|
|
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
}
|
|
|
|
pSample->OnDestroy();
|
|
|
|
// Return this part of the WM_QUIT message to Windows.
|
|
return static_cast<char>(msg.wParam);
|
|
}
|
|
|
|
// Main message handler for the sample.
|
|
LRESULT CALLBACK Win32Application::WindowProc(HWND hWnd, UINT message,
|
|
WPARAM wParam, LPARAM lParam) {
|
|
DX12CudaSample* pSample =
|
|
reinterpret_cast<DX12CudaSample*>(GetWindowLongPtr(hWnd, GWLP_USERDATA));
|
|
|
|
switch (message) {
|
|
case WM_CREATE: {
|
|
// Save the DXSample* passed in to CreateWindow.
|
|
LPCREATESTRUCT pCreateStruct = reinterpret_cast<LPCREATESTRUCT>(lParam);
|
|
SetWindowLongPtr(
|
|
hWnd, GWLP_USERDATA,
|
|
reinterpret_cast<LONG_PTR>(pCreateStruct->lpCreateParams));
|
|
}
|
|
return 0;
|
|
|
|
case WM_KEYDOWN:
|
|
if (pSample) {
|
|
pSample->OnKeyDown(static_cast<UINT8>(wParam));
|
|
}
|
|
return 0;
|
|
|
|
case WM_KEYUP:
|
|
if (pSample) {
|
|
pSample->OnKeyUp(static_cast<UINT8>(wParam));
|
|
}
|
|
return 0;
|
|
|
|
case WM_PAINT:
|
|
if (pSample) {
|
|
pSample->OnRender();
|
|
}
|
|
return 0;
|
|
|
|
case WM_DESTROY:
|
|
PostQuitMessage(0);
|
|
return 0;
|
|
}
|
|
|
|
// Handle any messages the switch statement didn't.
|
|
return DefWindowProc(hWnd, message, wParam, lParam);
|
|
}
|