From: José Fonseca Date: Thu, 3 May 2012 10:20:41 +0000 (+0100) Subject: Simple D3D9 app. X-Git-Url: https://git.cworth.org/git?p=apitrace-tests;a=commitdiff_plain;h=799a2cd3f002cb517b0c461ee0cb9feb31dc5761 Simple D3D9 app. --- diff --git a/CMakeLists.txt b/CMakeLists.txt index cd7f9d1..67bbb3c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,8 +2,23 @@ cmake_minimum_required (VERSION 2.8) project (apitrace-tests) +find_path (APITRACE_SOURCE_DIR NAMES cmake/FindDirectX.cmake PATHS .. ../.. DOC "apitrace source tree" NO_DEFAULT_PATH) +if (NOT EXISTS ${APITRACE_SOURCE_DIR}) + message (SEND_ERROR "Please specify path to apitrace source tree via APITRACE_SOURCE_DIR") +endif () + +find_program (APITRACE_EXECUTABLE NAMES apitrace PATHS ${APITRACE_SOURCE_DIR} DOC "apitrace executable") +if (NOT EXISTS ${APITRACE_EXECUTABLE}) + message (SEND_ERROR "Please specify path to apitrace executable via APITRACE_EXECUTABLE") +endif () + include (FindPkgConfig) +if (APITRACE_SOURCE_DIR) + set (CMAKE_MODULE_PATH ${APITRACE_SOURCE_DIR}/cmake) + find_package (DirectX) +endif () + # Set default built type if (NOT CMAKE_BUILD_TYPE) set (CMAKE_BUILD_TYPE Debug @@ -64,8 +79,6 @@ if (MSVC) add_definitions (-wd4244) # conversion' conversion from 'type1' to 'type2', possible loss of data endif () -find_program (APITRACE_EXECUTABLE apitrace DOC "apitrace executable") - enable_testing() add_subdirectory (apps) diff --git a/README.markdown b/README.markdown index 2820428..c32d9e6 100644 --- a/README.markdown +++ b/README.markdown @@ -8,7 +8,7 @@ In addition to apitrace requirements, it also requires: To run the test suite do on Unices: - cmake -DAPITRACE_EXECUTABLE=/path/to/apitrace -H. -B./build + cmake -DAPITRACE_SOURCE_DIR=/path/to/apitrace/tree -DAPITRACE_EXECUTABLE=/path/to/apitrace/build/apitrace -H. -B./build export CTEST_OUTPUT_ON_FAILURE=1 make -C ./build all test diff --git a/app_driver.py b/app_driver.py index 33d2d5e..2c7a319 100755 --- a/app_driver.py +++ b/app_driver.py @@ -170,11 +170,20 @@ class AppDriver(Driver): if p.returncode: skip('application returned code %i' % p.returncode) - api_map = { + api_trace_map = { 'gl': 'gl', 'egl_gl': 'egl', 'egl_gles1': 'egl', 'egl_gles2': 'egl', + 'd3d9': 'd3d9', + } + + api_retrace_map = { + 'gl': 'glretrace', + 'egl_gl': 'eglretrace', + 'egl_gles1': 'eglretrace', + 'egl_gles2': 'eglretrace', + 'd3d9': 'd3dretrace', } def traceApp(self): @@ -202,7 +211,7 @@ class AppDriver(Driver): cmd = [ options.apitrace, 'trace', - '--api', self.api_map[self.api], + '--api', self.api_trace_map[self.api], '--output', self.trace_file, '--' ] + cmd @@ -395,7 +404,7 @@ class AppDriver(Driver): pass def _retrace(self, args = None, stdout=subprocess.PIPE): - retrace = self.api_map[self.api] + 'retrace' + retrace = self.api_retrace_map[self.api] cmd = [get_build_program(retrace)] if self.doubleBuffer: cmd += ['-db'] diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index 1793709..98c41f5 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -15,6 +15,7 @@ function (ADD_APP_TEST) COMMAND python ${CMAKE_SOURCE_DIR}/app_driver.py --apitrace ${APITRACE_EXECUTABLE} + --apitrace-source ${APITRACE_SOURCE_DIR} --api ${api} --ref-dump ${CMAKE_CURRENT_SOURCE_DIR}/${TEST_REF} -- @@ -30,3 +31,7 @@ endif () if (EGL_FOUND) add_subdirectory (egl) endif () + +if (DirectX_D3D9_FOUND) + add_subdirectory (d3d9) +endif () diff --git a/apps/d3d9/CMakeLists.txt b/apps/d3d9/CMakeLists.txt new file mode 100644 index 0000000..999879b --- /dev/null +++ b/apps/d3d9/CMakeLists.txt @@ -0,0 +1,27 @@ +include_directories ( + ${DirectX_D3D9_INCLUDE_DIR} +) + +link_libraries ( + ${DirectX_D3D9_LIBRARY} +) + +set (api d3d9) + +set (targets + tri +) + +foreach (target ${targets}) + add_executable (${api}_${target} WIN32 ${target}.cpp) + set_target_properties (${api}_${target} PROPERTIES OUTPUT_NAME ${target}) + + if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${target}.ref.txt) + add_app_test( + NAME ${api}_${target} + TARGET ${api}_${target} + REF ${target}.ref.txt + ) + endif () +endforeach (target) + diff --git a/apps/d3d9/tri.cpp b/apps/d3d9/tri.cpp new file mode 100644 index 0000000..8166734 --- /dev/null +++ b/apps/d3d9/tri.cpp @@ -0,0 +1,168 @@ +/************************************************************************** + * + * Copyright 2012 Jose Fonseca + * All Rights Reserved. + * + * 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 + +#include + + +static IDirect3D9 * g_pD3D = NULL; +static IDirect3DDevice9 * g_pDevice = NULL; +static D3DPRESENT_PARAMETERS g_PresentationParameters; + + +int WINAPI +WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow) +{ + HRESULT hr; + + WNDCLASSEX wc = { + sizeof(WNDCLASSEX), + CS_CLASSDC, + DefWindowProc, + 0, + 0, + hInstance, + NULL, + NULL, + NULL, + NULL, + "SimpleDX9", + NULL + }; + RegisterClassEx(&wc); + + const int WindowWidth = 250; + const int WindowHeight = 250; + BOOL Windowed = TRUE; + + DWORD dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW; + + RECT rect = {0, 0, WindowWidth, WindowHeight}; + AdjustWindowRect(&rect, dwStyle, FALSE); + + HWND hWnd = CreateWindow(wc.lpszClassName, + "Simple example using DirectX9", + dwStyle, + CW_USEDEFAULT, CW_USEDEFAULT, + rect.right - rect.left, + rect.bottom - rect.top, + NULL, + NULL, + hInstance, + NULL); + if (!hWnd) { + return 1; + } + + ShowWindow(hWnd, SW_SHOW); + + g_pD3D = Direct3DCreate9(D3D_SDK_VERSION); + if (!g_pD3D) { + return 1; + } + + D3DCAPS9 caps; + hr = g_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); + if (FAILED(hr)) { + return 1; + } + + DWORD dwBehaviorFlags; + if ((caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0 || + caps.VertexShaderVersion < D3DVS_VERSION(1, 1)) { + dwBehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING; + } else { + dwBehaviorFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING; + } + + ZeroMemory(&g_PresentationParameters, sizeof g_PresentationParameters); + g_PresentationParameters.Windowed = Windowed; + if (!Windowed) { + g_PresentationParameters.BackBufferWidth = WindowWidth; + g_PresentationParameters.BackBufferHeight = WindowHeight; + } + g_PresentationParameters.BackBufferCount = 1; + g_PresentationParameters.SwapEffect = D3DSWAPEFFECT_FLIP; + if (!Windowed) { + g_PresentationParameters.BackBufferFormat = D3DFMT_X8R8G8B8; + } else { + g_PresentationParameters.BackBufferFormat = D3DFMT_UNKNOWN; + } + g_PresentationParameters.hDeviceWindow = hWnd; + + g_PresentationParameters.EnableAutoDepthStencil = FALSE; + g_PresentationParameters.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; + + hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, + D3DDEVTYPE_HAL, + hWnd, + dwBehaviorFlags, + &g_PresentationParameters, + &g_pDevice); + if (FAILED(hr)) { + g_pD3D->Release(); + g_pD3D = NULL; + return 1; + } + + struct Vertex { + float x, y, z; + DWORD color; + }; + + + D3DCOLOR clearColor = D3DCOLOR_COLORVALUE(0.3f, 0.1f, 0.3f, 1.0f); + g_pDevice->Clear(0, NULL, D3DCLEAR_TARGET, clearColor, 1.0f, 0); + g_pDevice->BeginScene(); + + g_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE); + g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + + static const Vertex vertices[] = { + { -0.9f, -0.9f, 0.5f, D3DCOLOR_COLORVALUE(0.8f, 0.0f, 0.0f, 0.1f) }, + { 0.9f, -0.9f, 0.5f, D3DCOLOR_COLORVALUE(0.0f, 0.9f, 0.0f, 0.1f) }, + { 0.0f, 0.9f, 0.5f, D3DCOLOR_COLORVALUE(0.0f, 0.0f, 0.7f, 0.1f) }, + }; + + g_pDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE); + g_pDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, vertices, sizeof(Vertex)); + + g_pDevice->EndScene(); + + g_pDevice->Present(NULL, NULL, NULL, NULL); + + + g_pDevice->Release(); + g_pDevice = NULL; + g_pD3D->Release(); + g_pD3D = NULL; + + DestroyWindow(hWnd); + + return 0; +} + diff --git a/apps/d3d9/tri.ref.txt b/apps/d3d9/tri.ref.txt new file mode 100644 index 0000000..e69de29 diff --git a/base_driver.py b/base_driver.py index 1be1432..1971fce 100644 --- a/base_driver.py +++ b/base_driver.py @@ -107,6 +107,9 @@ def get_build_program(program): def get_scripts_path(): + if options.apitrace_source: + return os.path.join(options.apitrace_source, 'scripts') + bin_path = get_bin_path() try_paths = [ @@ -147,6 +150,10 @@ class Driver: '--apitrace', metavar='PROGRAM', type='string', dest='apitrace', default=default_apitrace, help='path to apitrace executable') + optparser.add_option( + '--apitrace-source', metavar='PATH', + type='string', dest='apitrace_source', + help='path to apitrace source tree') optparser.add_option( '-C', '--directory', metavar='PATH', type='string', dest='cwd', default=None, diff --git a/traces/CMakeLists.txt b/traces/CMakeLists.txt index c1e0500..983be78 100644 --- a/traces/CMakeLists.txt +++ b/traces/CMakeLists.txt @@ -8,6 +8,7 @@ foreach (script ${scripts}) COMMAND python ${CMAKE_SOURCE_DIR}/tool_driver.py --apitrace ${APITRACE_EXECUTABLE} + --apitrace-source ${APITRACE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${script} ) endforeach (script)