本文整理汇总了C++中ThrowIfFailed函数的典型用法代码示例。如果您正苦于以下问题:C++ ThrowIfFailed函数的具体用法?C++ ThrowIfFailed怎么用?C++ ThrowIfFailed使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了ThrowIfFailed函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: UNREFERENCED_PARAMETER
IFACEMETHODIMP ImageControlMixIn::MeasureOverride(
Size availableSize,
Size* returnValue)
{
UNREFERENCED_PARAMETER(availableSize);
return ExceptionBoundary(
[&]
{
Size zeroSize{ 0, 0 };
//
// Call Measure on our children (in this case just the image control).
//
ThrowIfFailed(As<IUIElement>(m_imageControl)->Measure(zeroSize));
//
// Reply that we're happy to be sized however the layout engine wants to size us.
//
*returnValue = zeroSize;
});
}
示例2: PIXBeginEvent
// Render the scene.
void D3D1211on12::OnRender()
{
PIXBeginEvent(m_commandQueue.Get(), 0, L"Render 3D");
// Record all the commands we need to render the scene into the command list.
PopulateCommandList();
// Execute the command list.
ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() };
m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists);
PIXEndEvent(m_commandQueue.Get());
PIXBeginEvent(m_commandQueue.Get(), 0, L"Render UI");
RenderUI();
PIXEndEvent(m_commandQueue.Get());
// Present the frame.
ThrowIfFailed(m_swapChain->Present(1, 0));
MoveToNextFrame();
}
示例3: WaitForGpu
void D3D12HDR::UpdateSwapChainBuffer(UINT width, UINT height, DXGI_FORMAT format)
{
if (!m_swapChain)
{
return;
}
// Flush all current GPU commands.
WaitForGpu();
// Release the resources holding references to the swap chain (requirement of
// IDXGISwapChain::ResizeBuffers) and reset the frame fence values to the
// current fence value.
for (UINT n = 0; n < FrameCount; n++)
{
m_renderTargets[n].Reset();
m_fenceValues[n] = m_fenceValues[m_frameIndex];
}
if (m_enableUI)
{
m_uiLayer->ReleaseResources();
}
// Resize the swap chain to the desired dimensions.
DXGI_SWAP_CHAIN_DESC1 desc = {};
m_swapChain->GetDesc1(&desc);
ThrowIfFailed(m_swapChain->ResizeBuffers(FrameCount, width, height, format, desc.Flags));
EnsureSwapChainColorSpace(m_currentSwapChainBitDepth, m_enableST2084);
// Reset the frame index to the current back buffer index.
m_frameIndex = m_swapChain->GetCurrentBackBufferIndex();
// Update the width, height, and aspect ratio member variables.
UpdateForSizeChange(width, height);
LoadSizeDependentResources();
}
示例4: getStartTimerIndx
UINT64 GpuTimer::getTimeSpanInMs( const UINT frameNum, const char* timeSpanName )
{
// Get the timestamp values for the given frame and time span from the result buffers.
const D3D12_RANGE emptyRange = {};
D3D12_RANGE readRange = {};
readRange.Begin = getStartTimerIndx( frameNum, timeSpanName ) * sizeof( UINT64 );
readRange.End = readRange.Begin + 2 * sizeof( UINT64 );
void* pData = nullptr;
ThrowIfFailed( m_timestampResultBuffer->Map( 0, &readRange, &pData ) );
const UINT64* pTimestamps = reinterpret_cast<UINT64*>( static_cast<UINT8*>( pData ) + readRange.Begin );
const UINT64 timeStampDelta = pTimestamps[ 1 ] - pTimestamps[ 0 ];
// Unmap with an empty range (written range).
m_timestampResultBuffer->Unmap( 0, &emptyRange );
// Compute the duration of the given time span in microseconds.
m_timeSpans[ timeSpanName ].duration = ( timeStampDelta * 1000000 ) / m_timestampFrequency;
return m_timeSpans[ timeSpanName ].duration;
}
示例5: RenderDeviceChild
VertexBuffer::VertexBuffer(RenderDevice* renderDevice, u32 vertexSize, u32 vertexCount, BufferUsage bufferUsage, void* initialData)
: RenderDeviceChild(renderDevice)
, m_vertexSize(vertexSize)
, m_vertexCount(vertexCount)
, m_bufferUsage(bufferUsage)
, m_pImpl(make_unique<Impl>())
{
TALON_ASSERT((initialData != nullptr || bufferUsage == BufferUsage::Dynamic) && "Initial data is required, unless the buffer is writable!");
D3D11_BUFFER_DESC bufferDesc = {0};
bufferDesc.ByteWidth = vertexSize * vertexCount;
bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags = bufferUsage == BufferUsage::Dynamic ? D3D11_CPU_ACCESS_WRITE : 0;
bufferDesc.MiscFlags = 0;
bufferDesc.StructureByteStride = 0;
switch(bufferUsage)
{
case BufferUsage::Default:
bufferDesc.Usage = D3D11_USAGE_DEFAULT;
break;
case BufferUsage::Dynamic:
bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
break;
case BufferUsage::Immutable:
bufferDesc.Usage = D3D11_USAGE_IMMUTABLE;
break;
}
D3D11_SUBRESOURCE_DATA bufferData = {0};
bufferData.pSysMem = initialData;
bufferData.SysMemPitch = 0;
bufferData.SysMemSlicePitch = 0;
ThrowIfFailed(renderDevice->GetDevice()->CreateBuffer(&bufferDesc, initialData == nullptr ? nullptr : &bufferData, &m_pImpl->vertexBuffer));
D3D11::SetDebugName(m_pImpl->vertexBuffer, "VertexBuffer");
}
示例6: SizeDipsToPixels
void CanvasSwapChain::ResizeBuffersImpl(
D2DResourceLock const& lock,
float newWidth,
float newHeight,
float newDpi,
DirectXPixelFormat newFormat,
int32_t bufferCount)
{
auto swapChain = As<IDXGISwapChain2>(GetResource());
int widthInPixels = SizeDipsToPixels(newWidth, newDpi);
int heightInPixels = SizeDipsToPixels(newHeight, newDpi);
ThrowIfNegative(bufferCount);
ThrowIfNegative(widthInPixels);
ThrowIfNegative(heightInPixels);
ThrowIfFailed(swapChain->ResizeBuffers(
bufferCount,
widthInPixels,
heightInPixels,
static_cast<DXGI_FORMAT>(newFormat),
0));
if (m_isCoreWindowSwapChain)
{
// CoreWindow swap chains can't get or set the transform matrix.
m_dpi = newDpi;
}
else
{
// Update the transform matrix to account for any DPI changes
DXGI_MATRIX_3X2_F dpiIndependentTransform = GetMatrixInternal(lock, swapChain);
m_dpi = newDpi;
SetMatrixInternal(lock, swapChain, &dpiIndependentTransform);
}
}
示例7: XMFLOAT2
void SpecularLightingDemo::CreateVertexBuffer(ID3D11Device* device, const Mesh& mesh, ID3D11Buffer** vertexBuffer) const {
const std::vector < XMFLOAT3 >& sourceVertices = mesh.Vertices();
const std::vector < XMFLOAT3 >& sourceNormals = mesh.Normals();
const auto& sourceUVs = mesh.TextureCoordinates().at(0);
std::vector <VertexPositionTextureNormal> vertices;
vertices.reserve(sourceVertices.size());
for (UINT i = 0; i < sourceVertices.size(); i++) {
const XMFLOAT3& position = sourceVertices.at(i);
const XMFLOAT3& uv = sourceUVs->at(i);
const XMFLOAT3& normal = sourceNormals.at(i);
vertices.push_back(VertexPositionTextureNormal(XMFLOAT4(position.x, position.y, position.z, 1.0f), XMFLOAT2(uv.x, uv.y), normal));
}
//Vertex Buffer
D3D11_BUFFER_DESC vertexBufferDesc = { 0 };
vertexBufferDesc.ByteWidth = sizeof(VertexPositionTextureNormal) * static_cast<UINT>(vertices.size());
vertexBufferDesc.Usage = D3D11_USAGE_IMMUTABLE;
vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
D3D11_SUBRESOURCE_DATA vertexSubResourceData = { 0 };
vertexSubResourceData.pSysMem = &vertices[0];
ThrowIfFailed(device->CreateBuffer(&vertexBufferDesc, &vertexSubResourceData, vertexBuffer), "ID3D11Device::CreateBuffer() failed.");
}
示例8: ExceptionBoundary
IFACEMETHODIMP CanvasCommandList::CreateDrawingSession(
ICanvasDrawingSession** drawingSession)
{
return ExceptionBoundary(
[&]
{
CheckAndClearOutPointer(drawingSession);
if (m_d2dCommandListIsClosed)
ThrowHR(E_INVALIDARG, Strings::CommandListCannotBeDrawnToAfterItHasBeenUsed);
auto& d2dCommandList = GetResource();
auto& device = m_device.EnsureNotClosed();
auto deviceContext = As<ICanvasDeviceInternal>(device)->CreateDeviceContextForDrawingSession();
deviceContext->SetTarget(d2dCommandList.Get());
auto adapter = std::make_shared<SimpleCanvasDrawingSessionAdapter>(deviceContext.Get());
auto ds = CanvasDrawingSession::CreateNew(deviceContext.Get(), adapter, device.Get());
ThrowIfFailed(ds.CopyTo(drawingSession));
});
}
示例9: ThrowIfFailed
void FrameResource::Init()
{
// Reset the command allocators and lists for the main thread.
for (int i = 0; i < CommandListCount; i++)
{
ThrowIfFailed(m_commandAllocators[i]->Reset());
ThrowIfFailed(m_commandLists[i]->Reset(m_commandAllocators[i].Get(), m_pipelineState.Get()));
}
// Clear the depth stencil buffer in preparation for rendering the shadow map.
m_commandLists[CommandListPre]->ClearDepthStencilView(m_shadowDepthView, D3D12_CLEAR_FLAG_DEPTH, 1.0f, 0, 0, nullptr);
// Reset the worker command allocators and lists.
for (int i = 0; i < NumContexts; i++)
{
ThrowIfFailed(m_shadowCommandAllocators[i]->Reset());
ThrowIfFailed(m_shadowCommandLists[i]->Reset(m_shadowCommandAllocators[i].Get(), m_pipelineStateShadowMap.Get()));
ThrowIfFailed(m_sceneCommandAllocators[i]->Reset());
ThrowIfFailed(m_sceneCommandLists[i]->Reset(m_sceneCommandAllocators[i].Get(), m_pipelineState.Get()));
}
}
示例10: ThrowIfFailed
void RenderSysem::LoadAssets()
{
// Create the command list.
ThrowIfFailed(m_pD3D12Device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_pCommandAllocator.Get(), nullptr, IID_PPV_ARGS(&m_pCommandList)));
// Command lists are created in the recording state, but there is nothing
// to record yet. The main loop expects it to be closed, so close it now.
ThrowIfFailed(m_pCommandList->Close());
// Create and record the bundle.
{
auto pPipelineState = m_Triangle.GetPipelineState();
ThrowIfFailed(m_pD3D12Device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_BUNDLE, m_pBundleAllocator.Get(), pPipelineState.Get(), IID_PPV_ARGS(&m_pBundleList)));
m_Triangle.Render(m_pBundleList);
ThrowIfFailed(m_pBundleList->Close());
}
// Create synchronization objects.
{
ThrowIfFailed(m_pD3D12Device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&m_pD3D12Fence)));
m_FenceValue = 1;
// Create an event handle to use for frame synchronization.
m_FenceEvent = CreateEventEx(nullptr, FALSE, FALSE, EVENT_ALL_ACCESS);
if (m_FenceEvent == nullptr)
{
ThrowIfFailed(HRESULT_FROM_WIN32(GetLastError()));
}
// Wait for the command list to execute; we are reusing the same command
// list in our main loop but for now, we just want to wait for setup to
// complete before continuing.
WaitForPreviousFrame();
}
}
示例11: defined
// Load the rendering pipeline dependencies.
void D3D12HDR::LoadPipeline()
{
#if defined(_DEBUG)
// Enable the debug layer (requires the Graphics Tools "optional feature").
// NOTE: Enabling the debug layer after device creation will invalidate the active device.
{
ComPtr<ID3D12Debug> debugController;
if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController))))
{
debugController->EnableDebugLayer();
// Enable additional debug layers.
m_dxgiFactoryFlags |= DXGI_CREATE_FACTORY_DEBUG;
}
}
#endif
ThrowIfFailed(CreateDXGIFactory2(m_dxgiFactoryFlags, IID_PPV_ARGS(&m_dxgiFactory)));
if (m_useWarpDevice)
{
ComPtr<IDXGIAdapter> warpAdapter;
ThrowIfFailed(m_dxgiFactory->EnumWarpAdapter(IID_PPV_ARGS(&warpAdapter)));
ThrowIfFailed(D3D12CreateDevice(
warpAdapter.Get(),
D3D_FEATURE_LEVEL_11_0,
IID_PPV_ARGS(&m_device)
));
}
else
{
ComPtr<IDXGIAdapter1> hardwareAdapter;
GetHardwareAdapter(m_dxgiFactory.Get(), &hardwareAdapter);
ThrowIfFailed(D3D12CreateDevice(
hardwareAdapter.Get(),
D3D_FEATURE_LEVEL_11_0,
IID_PPV_ARGS(&m_device)
));
}
// Describe and create the command queue.
D3D12_COMMAND_QUEUE_DESC queueDesc = {};
queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
ThrowIfFailed(m_device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&m_commandQueue)));
NAME_D3D12_OBJECT(m_commandQueue);
// Describe and create the swap chain.
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};
swapChainDesc.BufferCount = FrameCount;
swapChainDesc.Width = m_width;
swapChainDesc.Height = m_height;
swapChainDesc.Format = m_swapChainFormats[m_currentSwapChainBitDepth];
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
swapChainDesc.SampleDesc.Count = 1;
// It is recommended to always use the tearing flag when it is available.
swapChainDesc.Flags = m_tearingSupport ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
ComPtr<IDXGISwapChain1> swapChain;
ThrowIfFailed(m_dxgiFactory->CreateSwapChainForHwnd(
m_commandQueue.Get(), // Swap chain needs the queue so that it can force a flush on it.
Win32Application::GetHwnd(),
&swapChainDesc,
nullptr,
nullptr,
&swapChain
));
if (m_tearingSupport)
{
// When tearing support is enabled we will handle ALT+Enter key presses in the
// window message loop rather than let DXGI handle it by calling SetFullscreenState.
m_dxgiFactory->MakeWindowAssociation(Win32Application::GetHwnd(), DXGI_MWA_NO_ALT_ENTER);
}
ThrowIfFailed(swapChain.As(&m_swapChain));
// Check display HDR support and initialize ST.2084 support to match the display's support.
CheckDisplayHDRSupport();
m_enableST2084 = m_hdrSupport;
EnsureSwapChainColorSpace(m_currentSwapChainBitDepth, m_enableST2084);
SetHDRMetaData(HDRMetaDataPool[m_hdrMetaDataPoolIdx][0], HDRMetaDataPool[m_hdrMetaDataPoolIdx][1], HDRMetaDataPool[m_hdrMetaDataPoolIdx][2], HDRMetaDataPool[m_hdrMetaDataPoolIdx][3]);
m_frameIndex = m_swapChain->GetCurrentBackBufferIndex();
// Create descriptor heaps.
{
// Describe and create a render target view (RTV) descriptor heap.
D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc = {};
rtvHeapDesc.NumDescriptors = FrameCount + 2; // A descriptor for each frame + 2 intermediate render targets.
rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
rtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
ThrowIfFailed(m_device->CreateDescriptorHeap(&rtvHeapDesc, IID_PPV_ARGS(&m_rtvHeap)));
//.........这里部分代码省略.........
示例12: TransformVertex
// Recalculate vertex positions for the color space triangles and then update the vertex buffer.
// The scene's command list must be in the recording state when this method is called.
void D3D12HDR::UpdateVertexBuffer()
{
const XMFLOAT2 primaries709[] =
{
{ 0.64f, 0.33f },
{ 0.30f, 0.60f },
{ 0.15f, 0.06f },
{ 0.3127f, 0.3290f }
};
const XMFLOAT2 primaries2020[] =
{
{ 0.708f, 0.292f },
{ 0.170f, 0.797f },
{ 0.131f, 0.046f },
{ 0.3127f, 0.3290f }
};
const XMFLOAT2 offset1 = { 0.2f, 0.0f };
const XMFLOAT2 offset2 = { 0.2f, -1.0f };
const XMFLOAT3 triangle709[] =
{
TransformVertex(primaries709[0], offset1), // R
TransformVertex(primaries709[1], offset1), // G
TransformVertex(primaries709[2], offset1), // B
TransformVertex(primaries709[3], offset1) // White
};
const XMFLOAT3 triangle2020[] =
{
TransformVertex(primaries2020[0], offset2), // R
TransformVertex(primaries2020[1], offset2), // G
TransformVertex(primaries2020[2], offset2), // B
TransformVertex(primaries2020[3], offset2) // White
};
TrianglesVertex triangleVertices[] =
{
// Upper triangles. Rec 709 primaries.
{ triangle709[2], primaries709[2] },
{ triangle709[1], primaries709[1] },
{ triangle709[3], primaries709[3] },
{ triangle709[1], primaries709[1] },
{ triangle709[0], primaries709[0] },
{ triangle709[3], primaries709[3] },
{ triangle709[0], primaries709[0] },
{ triangle709[2], primaries709[2] },
{ triangle709[3], primaries709[3] },
// Lower triangles. Rec 2020 primaries.
{ triangle2020[2], primaries2020[2] },
{ triangle2020[1], primaries2020[1] },
{ triangle2020[3], primaries2020[3] },
{ triangle2020[1], primaries2020[1] },
{ triangle2020[0], primaries2020[0] },
{ triangle2020[3], primaries2020[3] },
{ triangle2020[0], primaries2020[0] },
{ triangle2020[2], primaries2020[2] },
{ triangle2020[3], primaries2020[3] },
};
// Copy data to the intermediate upload heap and then schedule a copy
// from the upload heap to the vertex buffer.
UINT8* mappedUploadHeap = nullptr;
ThrowIfFailed(m_vertexBufferUpload->Map(0, &CD3DX12_RANGE(0, 0), reinterpret_cast<void**>(&mappedUploadHeap)));
mappedUploadHeap += m_gradientVertexBufferView.SizeInBytes;
memcpy(mappedUploadHeap, triangleVertices, sizeof(triangleVertices));
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_vertexBuffer.Get(), D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER, D3D12_RESOURCE_STATE_COPY_DEST));
m_commandList->CopyBufferRegion(m_vertexBuffer.Get(), 0, m_vertexBufferUpload.Get(), 0, m_vertexBuffer->GetDesc().Width);
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_vertexBuffer.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER));
}
示例13: ThrowIfFailed
// Load the sample assets.
void D3D12HDR::LoadAssets()
{
// Create a root signature containing root constants for brightness information
// and the desired output curve as well as a SRV descriptor table pointing to the
// intermediate render targets.
{
CD3DX12_DESCRIPTOR_RANGE ranges[1];
ranges[0].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 2, 0);
CD3DX12_ROOT_PARAMETER rootParameters[2];
rootParameters[0].InitAsConstants(4, 0);
rootParameters[1].InitAsDescriptorTable(1, &ranges[0]);
D3D12_STATIC_SAMPLER_DESC sampler = {};
sampler.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT;
sampler.AddressU = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
sampler.AddressV = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
sampler.AddressW = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
sampler.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;
sampler.MaxLOD = D3D12_FLOAT32_MAX;
sampler.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
// Allow input layout and deny uneccessary access to certain pipeline stages.
D3D12_ROOT_SIGNATURE_FLAGS rootSignatureFlags =
D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT |
D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS |
D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS |
D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS;
CD3DX12_ROOT_SIGNATURE_DESC rootSignatureDesc;
rootSignatureDesc.Init(_countof(rootParameters), rootParameters, 1, &sampler, rootSignatureFlags);
ComPtr<ID3DBlob> signature;
ComPtr<ID3DBlob> error;
ThrowIfFailed(D3D12SerializeRootSignature(&rootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &signature, &error));
ThrowIfFailed(m_device->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), IID_PPV_ARGS(&m_rootSignature)));
}
// Create the pipeline state objects for the different views and render target formats
// as well as the intermediate blend step.
{
// Create the pipeline state for the scene geometry.
D3D12_INPUT_ELEMENT_DESC gradientElementDescs[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
};
// Describe and create the graphics pipeline state objects (PSO).
D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {};
psoDesc.InputLayout = { gradientElementDescs, _countof(gradientElementDescs) };
psoDesc.pRootSignature = m_rootSignature.Get();
psoDesc.VS = CD3DX12_SHADER_BYTECODE(g_gradientVS, sizeof(g_gradientVS));
psoDesc.PS = CD3DX12_SHADER_BYTECODE(g_gradientPS, sizeof(g_gradientPS));
psoDesc.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT);
psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT);
psoDesc.DepthStencilState.DepthEnable = FALSE;
psoDesc.DepthStencilState.StencilEnable = FALSE;
psoDesc.SampleMask = UINT_MAX;
psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
psoDesc.NumRenderTargets = 1;
psoDesc.RTVFormats[0] = m_intermediateRenderTargetFormat;
psoDesc.SampleDesc.Count = 1;
ThrowIfFailed(m_device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&m_pipelineStates[GradientPSO])));
// Create pipeline state for the color space triangles.
D3D12_INPUT_ELEMENT_DESC colorElementDescs[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
};
psoDesc.InputLayout = { colorElementDescs, _countof(colorElementDescs) };
psoDesc.VS = CD3DX12_SHADER_BYTECODE(g_paletteVS, sizeof(g_paletteVS));
psoDesc.PS = CD3DX12_SHADER_BYTECODE(g_palettePS, sizeof(g_palettePS));
psoDesc.RTVFormats[0] = m_intermediateRenderTargetFormat;
ThrowIfFailed(m_device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&m_pipelineStates[PalettePSO])));
// Create pipeline states for the final blend step.
// There will be one for each swap chain format the sample supports.
D3D12_INPUT_ELEMENT_DESC quadElementDescs[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
};
psoDesc.InputLayout = { quadElementDescs, _countof(quadElementDescs) };
psoDesc.VS = CD3DX12_SHADER_BYTECODE(g_presentVS, sizeof(g_presentVS));
psoDesc.PS = CD3DX12_SHADER_BYTECODE(g_presentPS, sizeof(g_presentPS));
psoDesc.RTVFormats[0] = m_swapChainFormats[_8];
ThrowIfFailed(m_device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&m_pipelineStates[Present8bitPSO])));
psoDesc.RTVFormats[0] = m_swapChainFormats[_10];
ThrowIfFailed(m_device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&m_pipelineStates[Present10bitPSO])));
//.........这里部分代码省略.........
示例14: defined
// Load the rendering pipeline dependencies.
void D3D12HelloWindow::LoadPipeline()
{
#if defined(_DEBUG)
// Enable the D3D12 debug layer.
{
ComPtr<ID3D12Debug> debugController;
if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController))))
{
debugController->EnableDebugLayer();
}
}
#endif
ComPtr<IDXGIFactory4> factory;
ThrowIfFailed(CreateDXGIFactory1(IID_PPV_ARGS(&factory)));
if (m_useWarpDevice)
{
ComPtr<IDXGIAdapter> warpAdapter;
ThrowIfFailed(factory->EnumWarpAdapter(IID_PPV_ARGS(&warpAdapter)));
ThrowIfFailed(D3D12CreateDevice(
warpAdapter.Get(),
D3D_FEATURE_LEVEL_11_0,
IID_PPV_ARGS(&m_device)
));
}
else
{
ComPtr<IDXGIAdapter1> hardwareAdapter;
GetHardwareAdapter(factory.Get(), &hardwareAdapter);
ThrowIfFailed(D3D12CreateDevice(
hardwareAdapter.Get(),
D3D_FEATURE_LEVEL_11_0,
IID_PPV_ARGS(&m_device)
));
}
// Describe and create the command queue.
D3D12_COMMAND_QUEUE_DESC queueDesc = {};
queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
ThrowIfFailed(m_device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&m_commandQueue)));
// Describe and create the swap chain.
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};
swapChainDesc.BufferCount = FrameCount;
swapChainDesc.Width = m_width;
swapChainDesc.Height = m_height;
swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
swapChainDesc.SampleDesc.Count = 1;
ComPtr<IDXGISwapChain1> swapChain;
ThrowIfFailed(factory->CreateSwapChainForHwnd(
m_commandQueue.Get(), // Swap chain needs the queue so that it can force a flush on it.
Win32Application::GetHwnd(),
&swapChainDesc,
nullptr,
nullptr,
&swapChain
));
// This sample does not support fullscreen transitions.
ThrowIfFailed(factory->MakeWindowAssociation(Win32Application::GetHwnd(), DXGI_MWA_NO_ALT_ENTER));
ThrowIfFailed(swapChain.As(&m_swapChain));
m_frameIndex = m_swapChain->GetCurrentBackBufferIndex();
// Create descriptor heaps.
{
// Describe and create a render target view (RTV) descriptor heap.
D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc = {};
rtvHeapDesc.NumDescriptors = FrameCount;
rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
rtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
ThrowIfFailed(m_device->CreateDescriptorHeap(&rtvHeapDesc, IID_PPV_ARGS(&m_rtvHeap)));
m_rtvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
}
// Create frame resources.
{
CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart());
// Create a RTV for each frame.
for (UINT n = 0; n < FrameCount; n++)
{
ThrowIfFailed(m_swapChain->GetBuffer(n, IID_PPV_ARGS(&m_renderTargets[n])));
m_device->CreateRenderTargetView(m_renderTargets[n].Get(), nullptr, rtvHandle);
rtvHandle.Offset(1, m_rtvDescriptorSize);
}
}
ThrowIfFailed(m_device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_commandAllocator)));
}
示例15: BeginFrame
// Render the scene.
void D3D12Multithreading::OnRender()
{
BeginFrame();
#if SINGLETHREADED
for (int i = 0; i < NumContexts; i++)
{
WorkerThread(reinterpret_cast<LPVOID>(i));
}
MidFrame();
EndFrame();
m_commandQueue->ExecuteCommandLists(_countof(m_pCurrentFrameResource->m_batchSubmit), m_pCurrentFrameResource->m_batchSubmit);
#else
for (int i = 0; i < NumContexts; i++)
{
SetEvent(m_workerBeginRenderFrame[i]); // Tell each worker to start drawing.
}
MidFrame();
EndFrame();
WaitForMultipleObjects(NumContexts, m_workerFinishShadowPass, TRUE, INFINITE);
// You can execute command lists on any thread. Depending on the work
// load, apps can choose between using ExecuteCommandLists on one thread
// vs ExecuteCommandList from multiple threads.
m_commandQueue->ExecuteCommandLists(NumContexts + 2, m_pCurrentFrameResource->m_batchSubmit); // Submit PRE, MID and shadows.
WaitForMultipleObjects(NumContexts, m_workerFinishedRenderFrame, TRUE, INFINITE);
// Submit remaining command lists.
m_commandQueue->ExecuteCommandLists(_countof(m_pCurrentFrameResource->m_batchSubmit) - NumContexts - 2, m_pCurrentFrameResource->m_batchSubmit + NumContexts + 2);
#endif
m_cpuTimer.Tick(NULL);
if (m_titleCount == TitleThrottle)
{
WCHAR cpu[64];
swprintf_s(cpu, L"%.4f CPU", m_cpuTime / m_titleCount);
SetCustomWindowText(cpu);
m_titleCount = 0;
m_cpuTime = 0;
}
else
{
m_titleCount++;
m_cpuTime += m_cpuTimer.GetElapsedSeconds() * 1000;
m_cpuTimer.ResetElapsedTime();
}
// Present and update the frame index for the next frame.
PIXBeginEvent(m_commandQueue.Get(), 0, L"Presenting to screen");
ThrowIfFailed(m_swapChain->Present(0, 0));
PIXEndEvent(m_commandQueue.Get());
m_frameIndex = m_swapChain->GetCurrentBackBufferIndex();
// Signal and increment the fence value.
m_pCurrentFrameResource->m_fenceValue = m_fenceValue;
ThrowIfFailed(m_commandQueue->Signal(m_fence.Get(), m_fenceValue));
m_fenceValue++;
}