/* Copyright (c) 2019, 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. */ #include "Win32Application.h" #include "stdafx.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(pSample->GetWidth()), static_cast(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(msg.wParam); } // Main message handler for the sample. LRESULT CALLBACK Win32Application::WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { DX12CudaSample* pSample = reinterpret_cast(GetWindowLongPtr(hWnd, GWLP_USERDATA)); switch (message) { case WM_CREATE: { // Save the DXSample* passed in to CreateWindow. LPCREATESTRUCT pCreateStruct = reinterpret_cast(lParam); SetWindowLongPtr( hWnd, GWLP_USERDATA, reinterpret_cast(pCreateStruct->lpCreateParams)); } return 0; case WM_KEYDOWN: if (pSample) { pSample->OnKeyDown(static_cast(wParam)); } return 0; case WM_KEYUP: if (pSample) { pSample->OnKeyUp(static_cast(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); }