Mesa (main): d3d10sw: Add a sanity test.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed May 19 14:24:34 UTC 2021
Module: Mesa
Branch: main
Commit: bd16133572292f61ab5c808431ff9fa0c878fc29
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=bd16133572292f61ab5c808431ff9fa0c878fc29
Author: Jose Fonseca <jfonseca at vmware.com>
Date: Wed May 5 14:51:34 2021 +0100
d3d10sw: Add a sanity test.
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Acked-by: Jesse Natalie <jenatali at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10687>
---
src/gallium/targets/d3d10sw/meson.build | 14 ++
src/gallium/targets/d3d10sw/tests/tri.cpp | 294 +++++++++++++++++++++++++
src/gallium/targets/d3d10sw/tests/tri_ps_4_0.h | 76 +++++++
src/gallium/targets/d3d10sw/tests/tri_vs_4_0.h | 93 ++++++++
4 files changed, 477 insertions(+)
diff --git a/src/gallium/targets/d3d10sw/meson.build b/src/gallium/targets/d3d10sw/meson.build
index 4e9a8dceaa6..fe8632d3c7f 100644
--- a/src/gallium/targets/d3d10sw/meson.build
+++ b/src/gallium/targets/d3d10sw/meson.build
@@ -43,3 +43,17 @@ libd3d10sw = shared_library(
name_prefix : '', # otherwise mingw will create libd3d10sw.dll
install : true,
)
+
+if with_tests
+ test(
+ 'd3d10sw',
+ executable(
+ 'test_d3d10sw',
+ files('tests/tri.cpp'),
+ cpp_args : [cpp_msvc_compat_args],
+ dependencies : [cpp.find_library('d3d11')],
+ link_with : [libd3d10sw],
+ ),
+ suite : ['d3d10sw'],
+ )
+endif
diff --git a/src/gallium/targets/d3d10sw/tests/tri.cpp b/src/gallium/targets/d3d10sw/tests/tri.cpp
new file mode 100644
index 00000000000..2dab88208c3
--- /dev/null
+++ b/src/gallium/targets/d3d10sw/tests/tri.cpp
@@ -0,0 +1,294 @@
+/**************************************************************************
+ *
+ * Copyright 2012-2021 VMware, Inc.
+ * 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 <stdio.h>
+#include <stddef.h>
+#include <string.h>
+
+#include <initguid.h>
+#include <windows.h>
+
+#include <d3d11.h>
+
+#include <wrl/client.h>
+
+using Microsoft::WRL::ComPtr;
+
+#include "tri_vs_4_0.h"
+#include "tri_ps_4_0.h"
+
+
+int
+main(int argc, char *argv[])
+{
+ HRESULT hr;
+
+ HINSTANCE hInstance = GetModuleHandle(nullptr);
+
+ WNDCLASSEX wc = {
+ sizeof(WNDCLASSEX),
+ CS_CLASSDC,
+ DefWindowProc,
+ 0,
+ 0,
+ hInstance,
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ "tri",
+ nullptr
+ };
+ RegisterClassEx(&wc);
+
+ const int WindowWidth = 250;
+ const int WindowHeight = 250;
+
+ DWORD dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW | WS_VISIBLE;
+
+ RECT rect = {0, 0, WindowWidth, WindowHeight};
+ AdjustWindowRect(&rect, dwStyle, FALSE);
+
+ HWND hWnd = CreateWindow(wc.lpszClassName,
+ "Simple example using DirectX10",
+ dwStyle,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ rect.right - rect.left,
+ rect.bottom - rect.top,
+ nullptr,
+ nullptr,
+ hInstance,
+ nullptr);
+ if (!hWnd) {
+ return EXIT_FAILURE;
+ }
+
+ UINT Flags = 0;
+ hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_NULL, 0, D3D11_CREATE_DEVICE_DEBUG, nullptr, 0, D3D11_SDK_VERSION, nullptr, nullptr, nullptr);
+ if (SUCCEEDED(hr)) {
+ Flags |= D3D11_CREATE_DEVICE_DEBUG;
+ }
+
+ static const D3D_FEATURE_LEVEL FeatureLevels[] = {
+ D3D_FEATURE_LEVEL_10_0
+ };
+
+ HMODULE hSoftware = LoadLibraryA("d3d10sw.dll");
+ if (!hSoftware) {
+ return EXIT_FAILURE;
+ }
+
+ DXGI_SWAP_CHAIN_DESC SwapChainDesc;
+ ZeroMemory(&SwapChainDesc, sizeof SwapChainDesc);
+ SwapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;;
+ SwapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
+ SwapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
+ SwapChainDesc.SampleDesc.Quality = 0;
+ SwapChainDesc.SampleDesc.Count = 1;
+ SwapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+ SwapChainDesc.BufferCount = 2;
+ SwapChainDesc.OutputWindow = hWnd;
+ SwapChainDesc.Windowed = true;
+ SwapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
+
+ ComPtr<ID3D11Device> pDevice;
+ ComPtr<ID3D11DeviceContext> pDeviceContext;
+ ComPtr<IDXGISwapChain> pSwapChain;
+ hr = D3D11CreateDeviceAndSwapChain(nullptr,
+ D3D_DRIVER_TYPE_SOFTWARE,
+ hSoftware,
+ Flags,
+ FeatureLevels,
+ _countof(FeatureLevels),
+ D3D11_SDK_VERSION,
+ &SwapChainDesc,
+ &pSwapChain,
+ &pDevice,
+ nullptr, /* pFeatureLevel */
+ &pDeviceContext);
+ if (FAILED(hr)) {
+ return EXIT_FAILURE;
+ }
+
+ ComPtr<IDXGIDevice> pDXGIDevice;
+ hr = pDevice->QueryInterface(IID_IDXGIDevice, (void **)&pDXGIDevice);
+ if (FAILED(hr)) {
+ return EXIT_FAILURE;
+ }
+
+ ComPtr<IDXGIAdapter> pAdapter;
+ hr = pDXGIDevice->GetAdapter(&pAdapter);
+ if (FAILED(hr)) {
+ return EXIT_FAILURE;
+ }
+
+ DXGI_ADAPTER_DESC Desc;
+ hr = pAdapter->GetDesc(&Desc);
+ if (FAILED(hr)) {
+ return EXIT_FAILURE;
+ }
+
+ printf("using %S\n", Desc.Description);
+
+ ComPtr<ID3D11Texture2D> pBackBuffer;
+ hr = pSwapChain->GetBuffer(0, IID_ID3D11Texture2D, (void **)&pBackBuffer);
+ if (FAILED(hr)) {
+ return EXIT_FAILURE;
+ }
+
+ D3D11_RENDER_TARGET_VIEW_DESC RenderTargetViewDesc;
+ ZeroMemory(&RenderTargetViewDesc, sizeof RenderTargetViewDesc);
+ RenderTargetViewDesc.Format = SwapChainDesc.BufferDesc.Format;
+ RenderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
+ RenderTargetViewDesc.Texture2D.MipSlice = 0;
+
+ ComPtr<ID3D11RenderTargetView> pRenderTargetView;
+ hr = pDevice->CreateRenderTargetView(pBackBuffer.Get(), &RenderTargetViewDesc, &pRenderTargetView);
+ if (FAILED(hr)) {
+ return EXIT_FAILURE;
+ }
+
+ pDeviceContext->OMSetRenderTargets(1, pRenderTargetView.GetAddressOf(), nullptr);
+
+
+ const float clearColor[4] = { 0.3f, 0.1f, 0.3f, 1.0f };
+ pDeviceContext->ClearRenderTargetView(pRenderTargetView.Get(), clearColor);
+
+ ComPtr<ID3D11VertexShader> pVertexShader;
+ hr = pDevice->CreateVertexShader(g_VS, sizeof g_VS, nullptr, &pVertexShader);
+ if (FAILED(hr)) {
+ return EXIT_FAILURE;
+ }
+
+ struct Vertex {
+ float position[4];
+ float color[4];
+ };
+
+ static const D3D11_INPUT_ELEMENT_DESC InputElementDescs[] = {
+ { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, offsetof(Vertex, position), D3D11_INPUT_PER_VERTEX_DATA, 0 },
+ { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, offsetof(Vertex, color), D3D11_INPUT_PER_VERTEX_DATA, 0 }
+ };
+
+ ComPtr<ID3D11InputLayout> pVertexLayout;
+ hr = pDevice->CreateInputLayout(InputElementDescs,
+ _countof(InputElementDescs),
+ g_VS, sizeof g_VS,
+ &pVertexLayout);
+ if (FAILED(hr)) {
+ return EXIT_FAILURE;
+ }
+
+ pDeviceContext->IASetInputLayout(pVertexLayout.Get());
+
+ ComPtr<ID3D11PixelShader> pPixelShader;
+ hr = pDevice->CreatePixelShader(g_PS, sizeof g_PS, nullptr, &pPixelShader);
+ if (FAILED(hr)) {
+ return EXIT_FAILURE;
+ }
+
+ pDeviceContext->VSSetShader(pVertexShader.Get(), nullptr, 0);
+ pDeviceContext->PSSetShader(pPixelShader.Get(), nullptr, 0);
+
+ static const Vertex vertices[] = {
+ { { -0.9f, -0.9f, 0.5f, 1.0f}, { 0.8f, 0.0f, 0.0f, 0.1f } },
+ { { 0.9f, -0.9f, 0.5f, 1.0f}, { 0.0f, 0.9f, 0.0f, 0.1f } },
+ { { 0.0f, 0.9f, 0.5f, 1.0f}, { 0.0f, 0.0f, 0.7f, 0.1f } },
+ };
+
+ D3D11_BUFFER_DESC BufferDesc;
+ ZeroMemory(&BufferDesc, sizeof BufferDesc);
+ BufferDesc.Usage = D3D11_USAGE_DYNAMIC;
+ BufferDesc.ByteWidth = sizeof vertices;
+ BufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
+ BufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ BufferDesc.MiscFlags = 0;
+
+ D3D11_SUBRESOURCE_DATA BufferData;
+ BufferData.pSysMem = vertices;
+ BufferData.SysMemPitch = 0;
+ BufferData.SysMemSlicePitch = 0;
+
+ ComPtr<ID3D11Buffer> pVertexBuffer;
+ hr = pDevice->CreateBuffer(&BufferDesc, &BufferData, &pVertexBuffer);
+ if (FAILED(hr)) {
+ return EXIT_FAILURE;
+ }
+
+ UINT Stride = sizeof(Vertex);
+ UINT Offset = 0;
+ pDeviceContext->IASetVertexBuffers(0, 1, pVertexBuffer.GetAddressOf(), &Stride, &Offset);
+
+ D3D11_VIEWPORT ViewPort;
+ ViewPort.TopLeftX = 0;
+ ViewPort.TopLeftY = 0;
+ ViewPort.Width = WindowWidth;
+ ViewPort.Height = WindowHeight;
+ ViewPort.MinDepth = 0.0f;
+ ViewPort.MaxDepth = 1.0f;
+ pDeviceContext->RSSetViewports(1, &ViewPort);
+
+ D3D11_RASTERIZER_DESC RasterizerDesc;
+ ZeroMemory(&RasterizerDesc, sizeof RasterizerDesc);
+ RasterizerDesc.CullMode = D3D11_CULL_NONE;
+ RasterizerDesc.FillMode = D3D11_FILL_SOLID;
+ RasterizerDesc.FrontCounterClockwise = true;
+ RasterizerDesc.DepthClipEnable = true;
+ ComPtr<ID3D11RasterizerState> pRasterizerState;
+ hr = pDevice->CreateRasterizerState(&RasterizerDesc, &pRasterizerState);
+ if (FAILED(hr)) {
+ return EXIT_FAILURE;
+ }
+ pDeviceContext->RSSetState(pRasterizerState.Get());
+
+ pDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
+
+ pDeviceContext->Draw(_countof(vertices), 0);
+
+ pSwapChain->Present(0, 0);
+
+ Sleep(1000);
+
+ ID3D11Buffer *pNullBuffer = nullptr;
+ UINT NullStride = 0;
+ UINT NullOffset = 0;
+ pDeviceContext->IASetVertexBuffers(0, 1, &pNullBuffer, &NullStride, &NullOffset);
+
+ pDeviceContext->OMSetRenderTargets(0, nullptr, nullptr);
+
+ pDeviceContext->IASetInputLayout(nullptr);
+
+ pDeviceContext->VSSetShader(nullptr, nullptr, 0);
+
+ pDeviceContext->PSSetShader(nullptr, nullptr, 0);
+
+ pDeviceContext->RSSetState(nullptr);
+
+ DestroyWindow(hWnd);
+
+ return EXIT_SUCCESS;
+}
+
diff --git a/src/gallium/targets/d3d10sw/tests/tri_ps_4_0.h b/src/gallium/targets/d3d10sw/tests/tri_ps_4_0.h
new file mode 100755
index 00000000000..27583cb265c
--- /dev/null
+++ b/src/gallium/targets/d3d10sw/tests/tri_ps_4_0.h
@@ -0,0 +1,76 @@
+#if 0
+//
+// Generated by Microsoft (R) D3D Shader Disassembler
+//
+//
+// fxc /nologo /Qstrip_reflect /T ps_4_0 /E PS /Fh
+// Z:/projects/apitrace/tests/apps/d3dcommon/tri_ps_4_0.h
+// Z:/projects/apitrace/tests/apps/d3dcommon/tri.fx
+//
+//
+// Input signature:
+//
+// Name Index Mask Register SysValue Format Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION 0 xyzw 0 POS float
+// COLOR 0 xyzw 1 NONE float xyzw
+//
+//
+// Output signature:
+//
+// Name Index Mask Register SysValue Format Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_Target 0 xyzw 0 TARGET float xyzw
+//
+ps_4_0
+dcl_input_ps linear v1.xyzw
+dcl_output o0.xyzw
+mov o0.xyzw, v1.xyzw
+ret
+// Approximately 0 instruction slots used
+#endif
+
+const BYTE g_PS[] =
+{
+ 68, 88, 66, 67, 89, 62,
+ 128, 137, 52, 137, 121, 63,
+ 223, 129, 145, 249, 18, 101,
+ 85, 245, 1, 0, 0, 0,
+ 244, 0, 0, 0, 3, 0,
+ 0, 0, 44, 0, 0, 0,
+ 128, 0, 0, 0, 180, 0,
+ 0, 0, 73, 83, 71, 78,
+ 76, 0, 0, 0, 2, 0,
+ 0, 0, 8, 0, 0, 0,
+ 56, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0,
+ 0, 0, 15, 0, 0, 0,
+ 68, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 1, 0,
+ 0, 0, 15, 15, 0, 0,
+ 83, 86, 95, 80, 79, 83,
+ 73, 84, 73, 79, 78, 0,
+ 67, 79, 76, 79, 82, 0,
+ 171, 171, 79, 83, 71, 78,
+ 44, 0, 0, 0, 1, 0,
+ 0, 0, 8, 0, 0, 0,
+ 32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0,
+ 0, 0, 15, 0, 0, 0,
+ 83, 86, 95, 84, 97, 114,
+ 103, 101, 116, 0, 171, 171,
+ 83, 72, 68, 82, 56, 0,
+ 0, 0, 64, 0, 0, 0,
+ 14, 0, 0, 0, 98, 16,
+ 0, 3, 242, 16, 16, 0,
+ 1, 0, 0, 0, 101, 0,
+ 0, 3, 242, 32, 16, 0,
+ 0, 0, 0, 0, 54, 0,
+ 0, 5, 242, 32, 16, 0,
+ 0, 0, 0, 0, 70, 30,
+ 16, 0, 1, 0, 0, 0,
+ 62, 0, 0, 1
+};
diff --git a/src/gallium/targets/d3d10sw/tests/tri_vs_4_0.h b/src/gallium/targets/d3d10sw/tests/tri_vs_4_0.h
new file mode 100755
index 00000000000..c33883819ea
--- /dev/null
+++ b/src/gallium/targets/d3d10sw/tests/tri_vs_4_0.h
@@ -0,0 +1,93 @@
+#if 0
+//
+// Generated by Microsoft (R) D3D Shader Disassembler
+//
+//
+// fxc /nologo /Qstrip_reflect /T vs_4_0 /E VS /Fh
+// Z:/projects/apitrace/tests/apps/d3dcommon/tri_vs_4_0.h
+// Z:/projects/apitrace/tests/apps/d3dcommon/tri.fx
+//
+//
+// Input signature:
+//
+// Name Index Mask Register SysValue Format Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// POSITION 0 xyzw 0 NONE float xyzw
+// COLOR 0 xyzw 1 NONE float xyzw
+//
+//
+// Output signature:
+//
+// Name Index Mask Register SysValue Format Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION 0 xyzw 0 POS float xyzw
+// COLOR 0 xyzw 1 NONE float xyzw
+//
+vs_4_0
+dcl_input v0.xyzw
+dcl_input v1.xyzw
+dcl_output_siv o0.xyzw, position
+dcl_output o1.xyzw
+mov o0.xyzw, v0.xyzw
+mov o1.xyzw, v1.xyzw
+ret
+// Approximately 0 instruction slots used
+#endif
+
+const BYTE g_VS[] =
+{
+ 68, 88, 66, 67, 97, 176,
+ 115, 92, 95, 18, 113, 92,
+ 95, 52, 139, 63, 171, 185,
+ 4, 206, 1, 0, 0, 0,
+ 64, 1, 0, 0, 3, 0,
+ 0, 0, 44, 0, 0, 0,
+ 124, 0, 0, 0, 208, 0,
+ 0, 0, 73, 83, 71, 78,
+ 72, 0, 0, 0, 2, 0,
+ 0, 0, 8, 0, 0, 0,
+ 56, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0,
+ 0, 0, 15, 15, 0, 0,
+ 65, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 1, 0,
+ 0, 0, 15, 15, 0, 0,
+ 80, 79, 83, 73, 84, 73,
+ 79, 78, 0, 67, 79, 76,
+ 79, 82, 0, 171, 79, 83,
+ 71, 78, 76, 0, 0, 0,
+ 2, 0, 0, 0, 8, 0,
+ 0, 0, 56, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0,
+ 0, 0, 3, 0, 0, 0,
+ 0, 0, 0, 0, 15, 0,
+ 0, 0, 68, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,
+ 0, 0, 3, 0, 0, 0,
+ 1, 0, 0, 0, 15, 0,
+ 0, 0, 83, 86, 95, 80,
+ 79, 83, 73, 84, 73, 79,
+ 78, 0, 67, 79, 76, 79,
+ 82, 0, 171, 171, 83, 72,
+ 68, 82, 104, 0, 0, 0,
+ 64, 0, 1, 0, 26, 0,
+ 0, 0, 95, 0, 0, 3,
+ 242, 16, 16, 0, 0, 0,
+ 0, 0, 95, 0, 0, 3,
+ 242, 16, 16, 0, 1, 0,
+ 0, 0, 103, 0, 0, 4,
+ 242, 32, 16, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0,
+ 101, 0, 0, 3, 242, 32,
+ 16, 0, 1, 0, 0, 0,
+ 54, 0, 0, 5, 242, 32,
+ 16, 0, 0, 0, 0, 0,
+ 70, 30, 16, 0, 0, 0,
+ 0, 0, 54, 0, 0, 5,
+ 242, 32, 16, 0, 1, 0,
+ 0, 0, 70, 30, 16, 0,
+ 1, 0, 0, 0, 62, 0,
+ 0, 1
+};
More information about the mesa-commit
mailing list