Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,4 @@ x64
packages
Test
/wiki
out
51 changes: 30 additions & 21 deletions AdaptiveTessellationCS40/AdaptiveTessellationCS40.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,9 @@ int WINAPI wWinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
DXUTCreateWindow( L"AdaptiveTessellationCS40" );
CWaitDlg CompilingShadersDlg;
if ( DXUT_EnsureD3D11APIs() )
{
CompilingShadersDlg.ShowDialog( L"Compiling Shaders" );
}
DXUTCreateDevice(D3D_FEATURE_LEVEL_10_0, true, 1024, 768 );
CompilingShadersDlg.DestroyDialog();
DXUTMainLoop(); // Enter into the DXUT render loop
Expand Down Expand Up @@ -287,8 +289,8 @@ HRESULT CALLBACK OnD3D11CreateDevice(ID3D11Device* pd3dDevice, const DXGI_SURFAC
// Warn the user that in order to support CS4x, a non-hardware device has been created, continue or quit?
if (DXUTGetDeviceSettings().d3d11.DriverType != D3D_DRIVER_TYPE_HARDWARE && bFirstOnCreateDevice)
{
if (MessageBox(0, L"CS4x capability is missing. "\
L"In order to continue, a non-hardware device has been created, "\
if (MessageBox(nullptr, L"CS4x capability is missing. "
L"In order to continue, a non-hardware device has been created, "
L"it will be very slow, continue?", L"Warning", MB_ICONEXCLAMATION | MB_YESNO) != IDYES)
return E_FAIL;
}
Expand All @@ -306,7 +308,7 @@ HRESULT CALLBACK OnD3D11CreateDevice(ID3D11Device* pd3dDevice, const DXGI_SURFAC
V_RETURN(DXUTFindDXSDKMediaFileCch(str, MAX_PATH, L"BaseMesh.obj"));

std::wifstream ifs(str);
WCHAR line[256] = { 0 };
WCHAR line[256] = {};
std::vector<XMFLOAT4> initdata;

// Parse the .obj file. Both triangle faces and quad faces are supported.
Expand All @@ -328,7 +330,7 @@ HRESULT CALLBACK OnD3D11CreateDevice(ID3D11Device* pd3dDevice, const DXGI_SURFAC
}
}

ifs.clear(0);
ifs.clear();
ifs.seekg(0);
while (ifs >> line)
{
Expand All @@ -339,29 +341,32 @@ HRESULT CALLBACK OnD3D11CreateDevice(ID3D11Device* pd3dDevice, const DXGI_SURFAC
{
ifs.getline(line, 255);
std::wstringstream ss(line);
int idx[4] = { 0 }, i = 0;
int idx[4] = {}, i = 0;
while (ss >> line)
{
std::wstringstream ss2(line);
ss2 >> idx[i++];
}

initdata.push_back(v[idx[0] - 1]); initdata.push_back(v[idx[1] - 1]); initdata.push_back(v[idx[2] - 1]);
initdata.push_back(v[static_cast<size_t>(idx[0] - 1)]);
initdata.push_back(v[static_cast<size_t>(idx[1] - 1)]);
initdata.push_back(v[static_cast<size_t>(idx[2] - 1)]);
if (i >= 4) // quad face?
{
initdata.push_back(v[idx[2] - 1]); initdata.push_back(v[idx[3] - 1]); initdata.push_back(v[idx[0] - 1]);
initdata.push_back(v[static_cast<size_t>(idx[2] - 1)]);
initdata.push_back(v[static_cast<size_t>(idx[3] - 1)]);
initdata.push_back(v[static_cast<size_t>(idx[0] - 1)]);
}
}
}
}

D3D11_BUFFER_DESC desc;
D3D11_BUFFER_DESC desc = {};
desc.Usage = D3D11_USAGE_DEFAULT;
desc.ByteWidth = static_cast<UINT>(sizeof(initdata[0]) * initdata.size());
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_VERTEX_BUFFER;
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA InitData;

D3D11_SUBRESOURCE_DATA InitData = {};
InitData.pSysMem = &initdata[0];
V_RETURN(pd3dDevice->CreateBuffer(&desc, &InitData, &g_pBaseVB));
DXUT_SetDebugName(g_pBaseVB, "Primary");
Expand All @@ -379,7 +384,7 @@ HRESULT CALLBACK OnD3D11CreateDevice(ID3D11Device* pd3dDevice, const DXGI_SURFAC
DXUT_SetDebugName(g_pBaseVS, "RenderBaseVS");

{
D3D11_INPUT_ELEMENT_DESC layout[] =
const D3D11_INPUT_ELEMENT_DESC layout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
Expand All @@ -396,11 +401,10 @@ HRESULT CALLBACK OnD3D11CreateDevice(ID3D11Device* pd3dDevice, const DXGI_SURFAC
DXUT_SetDebugName(g_pPS, "RenderPS");

// Setup constant buffer
D3D11_BUFFER_DESC Desc;
D3D11_BUFFER_DESC Desc = {};
Desc.Usage = D3D11_USAGE_DYNAMIC;
Desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
Desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
Desc.MiscFlags = 0;
Desc.ByteWidth = sizeof(XMFLOAT4X4);
V_RETURN(pd3dDevice->CreateBuffer(&Desc, nullptr, &g_pVSCB));
DXUT_SetDebugName(g_pVSCB, "XMMATRIX");
Expand All @@ -413,8 +417,8 @@ HRESULT CALLBACK OnD3D11CreateDevice(ID3D11Device* pd3dDevice, const DXGI_SURFAC
DXUT_SetDebugName( g_pRasWireFrame, "WireFrame" );

// Setup the camera's view parameters
static const XMVECTORF32 s_vecEye = { 0.f, 0.f, -300.f, 0.f };
static const XMVECTORF32 s_vecAt = { 10.0f, 20.0f, 0.0f, 0.f };
static const XMVECTORF32 s_vecEye = { { { 0.f, 0.f, -300.f, 0.f } } };
static const XMVECTORF32 s_vecAt = { { { 10.0f, 20.0f, 0.0f, 0.f } } };
g_Camera.SetViewParams( s_vecEye, s_vecAt );

g_Camera.SetScalers( 0.005f, 50 );
Expand All @@ -433,13 +437,16 @@ HRESULT CALLBACK OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, IDXGISwapCha
V_RETURN( g_D3DSettingsDlg.OnD3D11ResizedSwapChain( pd3dDevice, pBackBufferSurfaceDesc ) );
V_RETURN( g_Tessellator.OnD3D11ResizedSwapChain( pBackBufferSurfaceDesc ) );

auto const iwidth = static_cast<int>(pBackBufferSurfaceDesc->Width);
auto const iheight = static_cast<int>(pBackBufferSurfaceDesc->Height);

// Setup the camera's projection parameters
float fAspectRatio = pBackBufferSurfaceDesc->Width / ( FLOAT )pBackBufferSurfaceDesc->Height;
const float fAspectRatio = static_cast<float>(pBackBufferSurfaceDesc->Width) / static_cast<float>(pBackBufferSurfaceDesc->Height);
g_Camera.SetProjParams( XM_PI / 4, fAspectRatio, 1.0f, 500000.0f );

g_HUD.SetLocation( pBackBufferSurfaceDesc->Width - 170, 0 );
g_HUD.SetLocation( iwidth - 170, 0 );
g_HUD.SetSize( 170, 170 );
g_SampleUI.SetLocation( pBackBufferSurfaceDesc->Width - 260, pBackBufferSurfaceDesc->Height - 300 );
g_SampleUI.SetLocation( iwidth - 260, iheight - 300 );
g_SampleUI.SetSize( 170, 300 );

return hr;
Expand All @@ -465,11 +472,13 @@ void RenderText()
if ( g_bShowSampleUI )
{
auto pBackBufferSurfaceDesc = DXUTGetDXGIBackBufferSurfaceDesc();
g_pTxtHelper->SetInsertionPos( 2, pBackBufferSurfaceDesc->Height - 18 * 6 );
auto const iheight = static_cast<int>(pBackBufferSurfaceDesc->Height);

g_pTxtHelper->SetInsertionPos( 2, iheight - 18 * 6 );
g_pTxtHelper->SetForegroundColor( Colors::Orange );
g_pTxtHelper->DrawTextLine( L"Controls (F1 to hide):" );

g_pTxtHelper->SetInsertionPos( 20, pBackBufferSurfaceDesc->Height - 18 * 5 );
g_pTxtHelper->SetInsertionPos( 20, iheight - 18 * 5 );
g_pTxtHelper->DrawTextLine( L"Look: Left drag mouse\n"
L"Move: A,W,S,D or Arrow Keys\n"
L"Move up/down: Q,E or PgUp,PgDn\n"
Expand Down
124 changes: 124 additions & 0 deletions AdaptiveTessellationCS40/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.

cmake_minimum_required (VERSION 3.20)

project(AdaptiveTessellationCS40
DESCRIPTION "AdaptiveTessellationCS40 demonstrates some adaptive tessellation techniques implemented using Compute Shader 4.0."
HOMEPAGE_URL "https://github.com/walbourn/directx-sdk-samples"
LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/CMake")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/CMake")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/CMake")

set(CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBINFO Release)

if(DEFINED VCPKG_TARGET_ARCHITECTURE)
set(DIRECTX_ARCH ${VCPKG_TARGET_ARCHITECTURE})
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Ww][Ii][Nn]32$")
set(DIRECTX_ARCH x86)
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Xx]64$")
set(DIRECTX_ARCH x64)
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]$")
set(DIRECTX_ARCH arm)
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]64$")
set(DIRECTX_ARCH arm64)
endif()

add_executable(${PROJECT_NAME} WIN32
AdaptiveTessellationCS40.cpp
AdaptiveTessellationCS40.rc
resource.h
ScanCS.cpp
ScanCS.h
TessellatorCS40.cpp
TessellatorCS40.h
TessellatorCS40_defines.h
WaitDlg.h
)

find_package(dxut CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft::DXUTOpt Microsoft::DXUT)

find_package(directxmath CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft::DirectXMath)

target_link_libraries(${PROJECT_NAME} PRIVATE
d3dcompiler.lib dxguid.lib comctl32.lib usp10.lib imm32.lib version.lib
)

if(MSVC)
target_compile_options(${PROJECT_NAME} PRIVATE /Wall /GR /fp:fast "$<$<NOT:$<CONFIG:DEBUG>>:/guard:cf>")
target_link_options(${PROJECT_NAME} PRIVATE "$<$<NOT:$<CONFIG:DEBUG>>:/guard:cf>" /DYNAMICBASE /NXCOMPAT)

if((${CMAKE_SIZEOF_VOID_P} EQUAL 4) AND (NOT ${DIRECTX_ARCH} MATCHES "^arm"))
target_link_options(${PROJECT_NAME} PRIVATE /SAFESEH)
endif()

if((MSVC_VERSION GREATER_EQUAL 1928) AND (CMAKE_SIZEOF_VOID_P EQUAL 8)
AND ((NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.0)))
target_compile_options(${PROJECT_NAME} PRIVATE "$<$<NOT:$<CONFIG:DEBUG>>:/guard:ehcont>")
target_link_options(${PROJECT_NAME} PRIVATE "$<$<NOT:$<CONFIG:DEBUG>>:/guard:ehcont>")
endif()
else()
target_compile_definitions(${PROJECT_NAME} PRIVATE $<IF:$<CONFIG:DEBUG>,_DEBUG,NDEBUG>)
endif()

if(NOT ${DIRECTX_ARCH} MATCHES "^arm")
if(${CMAKE_SIZEOF_VOID_P} EQUAL "4")
set(ARCH_SSE2 $<$<CXX_COMPILER_ID:MSVC>:/arch:SSE2> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-msse2>)
else()
set(ARCH_SSE2 $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-msse2>)
endif()

target_compile_options(${PROJECT_NAME} PRIVATE ${ARCH_SSE2})
endif()

if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
target_compile_options(${PROJECT_NAME} PRIVATE
-Wpedantic -Wextra
"-Wno-c++98-compat" "-Wno-c++98-compat-pedantic"
"-Wno-exit-time-destructors" "-Wno-global-constructors" "-Wno-language-extension-token"
"-Wno-missing-prototypes" "-Wno-missing-variable-declarations" "-Wno-reserved-id-macro"
"-Wno-extra-semi-stmt")
elseif(MINGW)
target_compile_options(${PROJECT_NAME} PRIVATE -Wno-ignored-attributes)
target_link_options(${PROJECT_NAME} PRIVATE -municode)
elseif( CMAKE_CXX_COMPILER_ID MATCHES "MSVC" )
target_compile_options(${PROJECT_NAME} PRIVATE
/sdl /permissive- /Zc:__cplusplus /Zc:inline
"/wd4061" "/wd4365" "/wd4514" "/wd4571" "/wd4668" "/wd4710" "/wd4820" "/wd5039" "/wd5045")

if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.24)
target_compile_options(${PROJECT_NAME} PRIVATE /ZH:SHA_256)
endif()

if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.26)
target_compile_options(${PROJECT_NAME} PRIVATE /Zc:preprocessor /wd5105)
endif()

if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.27) AND (NOT (${DIRECTX_ARCH} MATCHES "^arm")))
target_link_options(${PROJECT_NAME} PRIVATE /CETCOMPAT)
endif()

if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.28)
target_compile_options(${PROJECT_NAME} PRIVATE /Zc:lambda)
endif()

if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.34)
target_compile_options(${PROJECT_NAME} PRIVATE /wd5262 /wd5264)
endif()

if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.35)
target_compile_options(${PROJECT_NAME} PRIVATE /Zc:templateScope)
endif()
endif()

if(WIN32)
target_compile_definitions(${PROJECT_NAME} PRIVATE _UNICODE UNICODE _WIN32_WINNT=0x0601)
endif()
Loading