Path: blob/21.2-virgl/src/gallium/targets/d3d10sw/tests/tri.cpp
4573 views
/**************************************************************************1*2* Copyright 2012-2021 VMware, Inc.3* All Rights Reserved.4*5* Permission is hereby granted, free of charge, to any person obtaining a copy6* of this software and associated documentation files (the "Software"), to deal7* in the Software without restriction, including without limitation the rights8* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell9* copies of the Software, and to permit persons to whom the Software is10* furnished to do so, subject to the following conditions:11*12* The above copyright notice and this permission notice shall be included in13* all copies or substantial portions of the Software.14*15* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR16* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,17* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE18* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER19* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,20* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN21* THE SOFTWARE.22*23**************************************************************************/242526#include <stdio.h>27#include <stddef.h>28#include <string.h>2930#include <initguid.h>31#include <windows.h>3233#include <d3d11.h>3435#include <wrl/client.h>3637using Microsoft::WRL::ComPtr;3839#include "tri_vs_4_0.h"40#include "tri_ps_4_0.h"414243int44main(int argc, char *argv[])45{46HRESULT hr;4748HINSTANCE hInstance = GetModuleHandle(nullptr);4950WNDCLASSEX wc = {51sizeof(WNDCLASSEX),52CS_CLASSDC,53DefWindowProc,540,550,56hInstance,57nullptr,58nullptr,59nullptr,60nullptr,61"tri",62nullptr63};64RegisterClassEx(&wc);6566const int WindowWidth = 250;67const int WindowHeight = 250;6869DWORD dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW | WS_VISIBLE;7071RECT rect = {0, 0, WindowWidth, WindowHeight};72AdjustWindowRect(&rect, dwStyle, FALSE);7374HWND hWnd = CreateWindow(wc.lpszClassName,75"Simple example using DirectX10",76dwStyle,77CW_USEDEFAULT, CW_USEDEFAULT,78rect.right - rect.left,79rect.bottom - rect.top,80nullptr,81nullptr,82hInstance,83nullptr);84if (!hWnd) {85return EXIT_FAILURE;86}8788UINT Flags = 0;89hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_NULL, 0, D3D11_CREATE_DEVICE_DEBUG, nullptr, 0, D3D11_SDK_VERSION, nullptr, nullptr, nullptr);90if (SUCCEEDED(hr)) {91Flags |= D3D11_CREATE_DEVICE_DEBUG;92}9394static const D3D_FEATURE_LEVEL FeatureLevels[] = {95D3D_FEATURE_LEVEL_10_096};9798HMODULE hSoftware = LoadLibraryA("d3d10sw.dll");99if (!hSoftware) {100return EXIT_FAILURE;101}102103DXGI_SWAP_CHAIN_DESC SwapChainDesc;104ZeroMemory(&SwapChainDesc, sizeof SwapChainDesc);105SwapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;;106SwapChainDesc.BufferDesc.RefreshRate.Numerator = 60;107SwapChainDesc.BufferDesc.RefreshRate.Denominator = 1;108SwapChainDesc.SampleDesc.Quality = 0;109SwapChainDesc.SampleDesc.Count = 1;110SwapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;111SwapChainDesc.BufferCount = 2;112SwapChainDesc.OutputWindow = hWnd;113SwapChainDesc.Windowed = true;114SwapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;115116ComPtr<ID3D11Device> pDevice;117ComPtr<ID3D11DeviceContext> pDeviceContext;118ComPtr<IDXGISwapChain> pSwapChain;119hr = D3D11CreateDeviceAndSwapChain(nullptr,120D3D_DRIVER_TYPE_SOFTWARE,121hSoftware,122Flags,123FeatureLevels,124_countof(FeatureLevels),125D3D11_SDK_VERSION,126&SwapChainDesc,127&pSwapChain,128&pDevice,129nullptr, /* pFeatureLevel */130&pDeviceContext);131if (FAILED(hr)) {132return EXIT_FAILURE;133}134135ComPtr<IDXGIDevice> pDXGIDevice;136hr = pDevice->QueryInterface(IID_IDXGIDevice, (void **)&pDXGIDevice);137if (FAILED(hr)) {138return EXIT_FAILURE;139}140141ComPtr<IDXGIAdapter> pAdapter;142hr = pDXGIDevice->GetAdapter(&pAdapter);143if (FAILED(hr)) {144return EXIT_FAILURE;145}146147DXGI_ADAPTER_DESC Desc;148hr = pAdapter->GetDesc(&Desc);149if (FAILED(hr)) {150return EXIT_FAILURE;151}152153printf("using %S\n", Desc.Description);154155ComPtr<ID3D11Texture2D> pBackBuffer;156hr = pSwapChain->GetBuffer(0, IID_ID3D11Texture2D, (void **)&pBackBuffer);157if (FAILED(hr)) {158return EXIT_FAILURE;159}160161D3D11_RENDER_TARGET_VIEW_DESC RenderTargetViewDesc;162ZeroMemory(&RenderTargetViewDesc, sizeof RenderTargetViewDesc);163RenderTargetViewDesc.Format = SwapChainDesc.BufferDesc.Format;164RenderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;165RenderTargetViewDesc.Texture2D.MipSlice = 0;166167ComPtr<ID3D11RenderTargetView> pRenderTargetView;168hr = pDevice->CreateRenderTargetView(pBackBuffer.Get(), &RenderTargetViewDesc, &pRenderTargetView);169if (FAILED(hr)) {170return EXIT_FAILURE;171}172173pDeviceContext->OMSetRenderTargets(1, pRenderTargetView.GetAddressOf(), nullptr);174175176const float clearColor[4] = { 0.3f, 0.1f, 0.3f, 1.0f };177pDeviceContext->ClearRenderTargetView(pRenderTargetView.Get(), clearColor);178179ComPtr<ID3D11VertexShader> pVertexShader;180hr = pDevice->CreateVertexShader(g_VS, sizeof g_VS, nullptr, &pVertexShader);181if (FAILED(hr)) {182return EXIT_FAILURE;183}184185struct Vertex {186float position[4];187float color[4];188};189190static const D3D11_INPUT_ELEMENT_DESC InputElementDescs[] = {191{ "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, offsetof(Vertex, position), D3D11_INPUT_PER_VERTEX_DATA, 0 },192{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, offsetof(Vertex, color), D3D11_INPUT_PER_VERTEX_DATA, 0 }193};194195ComPtr<ID3D11InputLayout> pVertexLayout;196hr = pDevice->CreateInputLayout(InputElementDescs,197_countof(InputElementDescs),198g_VS, sizeof g_VS,199&pVertexLayout);200if (FAILED(hr)) {201return EXIT_FAILURE;202}203204pDeviceContext->IASetInputLayout(pVertexLayout.Get());205206ComPtr<ID3D11PixelShader> pPixelShader;207hr = pDevice->CreatePixelShader(g_PS, sizeof g_PS, nullptr, &pPixelShader);208if (FAILED(hr)) {209return EXIT_FAILURE;210}211212pDeviceContext->VSSetShader(pVertexShader.Get(), nullptr, 0);213pDeviceContext->PSSetShader(pPixelShader.Get(), nullptr, 0);214215static const Vertex vertices[] = {216{ { -0.9f, -0.9f, 0.5f, 1.0f}, { 0.8f, 0.0f, 0.0f, 0.1f } },217{ { 0.9f, -0.9f, 0.5f, 1.0f}, { 0.0f, 0.9f, 0.0f, 0.1f } },218{ { 0.0f, 0.9f, 0.5f, 1.0f}, { 0.0f, 0.0f, 0.7f, 0.1f } },219};220221D3D11_BUFFER_DESC BufferDesc;222ZeroMemory(&BufferDesc, sizeof BufferDesc);223BufferDesc.Usage = D3D11_USAGE_DYNAMIC;224BufferDesc.ByteWidth = sizeof vertices;225BufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;226BufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;227BufferDesc.MiscFlags = 0;228229D3D11_SUBRESOURCE_DATA BufferData;230BufferData.pSysMem = vertices;231BufferData.SysMemPitch = 0;232BufferData.SysMemSlicePitch = 0;233234ComPtr<ID3D11Buffer> pVertexBuffer;235hr = pDevice->CreateBuffer(&BufferDesc, &BufferData, &pVertexBuffer);236if (FAILED(hr)) {237return EXIT_FAILURE;238}239240UINT Stride = sizeof(Vertex);241UINT Offset = 0;242pDeviceContext->IASetVertexBuffers(0, 1, pVertexBuffer.GetAddressOf(), &Stride, &Offset);243244D3D11_VIEWPORT ViewPort;245ViewPort.TopLeftX = 0;246ViewPort.TopLeftY = 0;247ViewPort.Width = WindowWidth;248ViewPort.Height = WindowHeight;249ViewPort.MinDepth = 0.0f;250ViewPort.MaxDepth = 1.0f;251pDeviceContext->RSSetViewports(1, &ViewPort);252253D3D11_RASTERIZER_DESC RasterizerDesc;254ZeroMemory(&RasterizerDesc, sizeof RasterizerDesc);255RasterizerDesc.CullMode = D3D11_CULL_NONE;256RasterizerDesc.FillMode = D3D11_FILL_SOLID;257RasterizerDesc.FrontCounterClockwise = true;258RasterizerDesc.DepthClipEnable = true;259ComPtr<ID3D11RasterizerState> pRasterizerState;260hr = pDevice->CreateRasterizerState(&RasterizerDesc, &pRasterizerState);261if (FAILED(hr)) {262return EXIT_FAILURE;263}264pDeviceContext->RSSetState(pRasterizerState.Get());265266pDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);267268pDeviceContext->Draw(_countof(vertices), 0);269270pSwapChain->Present(0, 0);271272Sleep(1000);273274ID3D11Buffer *pNullBuffer = nullptr;275UINT NullStride = 0;276UINT NullOffset = 0;277pDeviceContext->IASetVertexBuffers(0, 1, &pNullBuffer, &NullStride, &NullOffset);278279pDeviceContext->OMSetRenderTargets(0, nullptr, nullptr);280281pDeviceContext->IASetInputLayout(nullptr);282283pDeviceContext->VSSetShader(nullptr, nullptr, 0);284285pDeviceContext->PSSetShader(nullptr, nullptr, 0);286287pDeviceContext->RSSetState(nullptr);288289DestroyWindow(hWnd);290291return EXIT_SUCCESS;292}293294295296