-
Notifications
You must be signed in to change notification settings - Fork 513
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added PrimitiveBatch for drawing user primitives.
Also now set debug object names for all D3D resources (for PIX and debug layer leak reporting) PrimitiveBatch is a helper for easily and efficiently drawing dynamically generated geometry such as lines or trianges. It fills the same role as the legacy D3D9 APIs DrawPrimitiveUP and DrawIndexedPrimitiveUP. Dynamic submission is a highly effective pattern for drawing procedural geometry, and convenient for debug rendering, but is not nearly as efficient as static vertex buffers. Excessive dynamic submission is a common source of performance problems in apps. PrimitiveBatch manages the vertex and index buffers for you, using DISCARD and NO_OVERWRITE hints to avoid stalling the GPU pipeline. It automatically merges adjacent draw requests, so if you call DrawLine 100 times in a row, only a single GPU draw call will be generated. PrimitiveBatch is responsible for setting the vertex buffer, index buffer, and primitive topology, then issuing the final draw call. Unlike the higher level SpriteBatch helper, it does not provide shaders, set the input layout, or set any state objects. PrimitiveBatch is often used in conjunction with BasicEffect and the structures from VertexTypes.h, but it can work with any other shader or vertex formats of your own.
- Loading branch information
ShawnHargreaves_cp
authored and
ShawnHargreaves_cp
committed
Oct 12, 2012
1 parent
f887115
commit 38f1e61
Showing
18 changed files
with
652 additions
and
59 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
//-------------------------------------------------------------------------------------- | ||
// File: PrimitiveBatch.h | ||
// | ||
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF | ||
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO | ||
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A | ||
// PARTICULAR PURPOSE. | ||
// | ||
// Copyright (c) Microsoft Corporation. All rights reserved. | ||
// | ||
// http://go.microsoft.com/fwlink/?LinkId=248929 | ||
//-------------------------------------------------------------------------------------- | ||
|
||
#pragma once | ||
|
||
#include <d3d11.h> | ||
#include <memory.h> | ||
#include <memory> | ||
|
||
#pragma warning(push) | ||
#pragma warning(disable: 4005) | ||
#include <stdint.h> | ||
#pragma warning(pop) | ||
|
||
|
||
namespace DirectX | ||
{ | ||
namespace Internal | ||
{ | ||
// Base class, not to be used directly: clients should access this via the derived PrimitiveBatch<T>. | ||
class PrimitiveBatchBase | ||
{ | ||
protected: | ||
PrimitiveBatchBase(_In_ ID3D11DeviceContext* deviceContext, size_t maxIndices, size_t maxVertices, size_t vertexSize); | ||
PrimitiveBatchBase(PrimitiveBatchBase&& moveFrom); | ||
PrimitiveBatchBase& operator= (PrimitiveBatchBase&& moveFrom); | ||
virtual ~PrimitiveBatchBase(); | ||
|
||
public: | ||
// Begin/End a batch of primitive drawing operations. | ||
void Begin(); | ||
void End(); | ||
|
||
protected: | ||
// Internal, untyped drawing method. | ||
void Draw(D3D11_PRIMITIVE_TOPOLOGY topology, bool isIndexed, _In_opt_count_(indexCount) uint16_t const* indices, size_t indexCount, size_t vertexCount, _Out_ void** pMappedVertices); | ||
|
||
private: | ||
// Private implementation. | ||
class Impl; | ||
|
||
std::unique_ptr<Impl> pImpl; | ||
|
||
// Prevent copying. | ||
PrimitiveBatchBase(PrimitiveBatchBase const&); | ||
PrimitiveBatchBase& operator= (PrimitiveBatchBase const&); | ||
}; | ||
} | ||
|
||
|
||
// Template makes the API typesafe, eg. PrimitiveBatch<VertexPositionColor>. | ||
template<typename TVertex> | ||
class PrimitiveBatch : public Internal::PrimitiveBatchBase | ||
{ | ||
static const size_t DefaultBatchSize = 2048; | ||
|
||
public: | ||
PrimitiveBatch(_In_ ID3D11DeviceContext* deviceContext, size_t maxIndices = DefaultBatchSize * 3, size_t maxVertices = DefaultBatchSize) | ||
: PrimitiveBatchBase(deviceContext, maxIndices, maxVertices, sizeof(TVertex)) | ||
{ } | ||
|
||
PrimitiveBatch(PrimitiveBatch&& moveFrom) | ||
: PrimitiveBatchBase(std::move(moveFrom)) | ||
{ } | ||
|
||
PrimitiveBatch& operator= (PrimitiveBatch&& moveFrom) | ||
{ | ||
PrimitiveBatchBase::operator=(std::move(moveFrom)); | ||
return *this; | ||
} | ||
|
||
|
||
// Similar to the D3D9 API DrawPrimitiveUP. | ||
void Draw(D3D11_PRIMITIVE_TOPOLOGY topology, _In_reads_(vertexCount) TVertex const* vertices, size_t vertexCount) | ||
{ | ||
void* mappedVertices; | ||
|
||
PrimitiveBatchBase::Draw(topology, false, nullptr, 0, vertexCount, &mappedVertices); | ||
|
||
memcpy(mappedVertices, vertices, vertexCount * sizeof(TVertex)); | ||
} | ||
|
||
|
||
// Similar to the D3D9 API DrawIndexedPrimitiveUP. | ||
void DrawIndexed(D3D11_PRIMITIVE_TOPOLOGY topology, _In_reads_(indexCount) uint16_t const* indices, size_t indexCount, _In_reads_(vertexCount) TVertex const* vertices, size_t vertexCount) | ||
{ | ||
void* mappedVertices; | ||
|
||
PrimitiveBatchBase::Draw(topology, true, indices, indexCount, vertexCount, &mappedVertices); | ||
|
||
memcpy(mappedVertices, vertices, vertexCount * sizeof(TVertex)); | ||
} | ||
|
||
|
||
void DrawLine(TVertex const& v1, TVertex const& v2) | ||
{ | ||
TVertex* mappedVertices; | ||
|
||
PrimitiveBatchBase::Draw(D3D11_PRIMITIVE_TOPOLOGY_LINELIST, false, nullptr, 0, 2, reinterpret_cast<void**>(&mappedVertices)); | ||
|
||
mappedVertices[0] = v1; | ||
mappedVertices[1] = v2; | ||
} | ||
|
||
|
||
void DrawTriangle(TVertex const& v1, TVertex const& v2, TVertex const& v3) | ||
{ | ||
TVertex* mappedVertices; | ||
|
||
PrimitiveBatchBase::Draw(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, false, nullptr, 0, 3, reinterpret_cast<void**>(&mappedVertices)); | ||
|
||
mappedVertices[0] = v1; | ||
mappedVertices[1] = v2; | ||
mappedVertices[2] = v3; | ||
} | ||
|
||
|
||
void DrawQuad(TVertex const& v1, TVertex const& v2, TVertex const& v3, TVertex const& v4) | ||
{ | ||
static const uint16_t quadIndices[] = { 0, 1, 2, 0, 2, 3 }; | ||
|
||
TVertex* mappedVertices; | ||
|
||
PrimitiveBatchBase::Draw(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, true, quadIndices, 6, 4, reinterpret_cast<void**>(&mappedVertices)); | ||
|
||
mappedVertices[0] = v1; | ||
mappedVertices[1] = v2; | ||
mappedVertices[2] = v3; | ||
mappedVertices[3] = v4; | ||
} | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.