|
@@ -4,6 +4,7 @@
|
|
|
|
|
|
|
|
#include "BsD3D11Prerequisites.h"
|
|
#include "BsD3D11Prerequisites.h"
|
|
|
#include "BsGpuBuffer.h"
|
|
#include "BsGpuBuffer.h"
|
|
|
|
|
+#include "BsD3D11GpuBufferView.h"
|
|
|
|
|
|
|
|
namespace BansheeEngine
|
|
namespace BansheeEngine
|
|
|
{
|
|
{
|
|
@@ -34,6 +35,30 @@ namespace BansheeEngine
|
|
|
void copyData(GpuBufferCore& srcBuffer, UINT32 srcOffset,
|
|
void copyData(GpuBufferCore& srcBuffer, UINT32 srcOffset,
|
|
|
UINT32 dstOffset, UINT32 length, bool discardWholeBuffer = false) override;
|
|
UINT32 dstOffset, UINT32 length, bool discardWholeBuffer = false) override;
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Creates a buffer view that may be used for binding a buffer to a slot in the pipeline. Views allow you to specify
|
|
|
|
|
+ * how is data in the buffer organized to make it easier for the pipeline to interpret.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param[in] buffer Buffer to create the view for.
|
|
|
|
|
+ * @param[in] firstElement Position of the first element visible by the view.
|
|
|
|
|
+ * @param[in] numElements Number of elements to bind to the view.
|
|
|
|
|
+ * @param[in] usage Determines type of the view we are creating, and which slots in the pipeline will
|
|
|
|
|
+ * the view be bindable to.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @note If a view with this exact parameters already exists, it will be returned and new one will not be created.
|
|
|
|
|
+ * @note Only Default and RandomWrite views are supported for this type of buffer.
|
|
|
|
|
+ */
|
|
|
|
|
+ // TODO Low Priority: Perhaps reflect usage flag limitation by having an enum with only the supported two options?
|
|
|
|
|
+ static GpuBufferView* requestView(const SPtr<D3D11GpuBufferCore>& buffer, UINT32 firstElement,
|
|
|
|
|
+ UINT32 numElements, GpuViewUsage usage);
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Releases a view created with requestView.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @note View will only truly get released once all references to it are released.
|
|
|
|
|
+ */
|
|
|
|
|
+ static void releaseView(GpuBufferView* view);
|
|
|
|
|
+
|
|
|
/** Returns the internal DX11 GPU buffer object. */
|
|
/** Returns the internal DX11 GPU buffer object. */
|
|
|
ID3D11Buffer* getDX11Buffer() const;
|
|
ID3D11Buffer* getDX11Buffer() const;
|
|
|
|
|
|
|
@@ -48,18 +73,28 @@ namespace BansheeEngine
|
|
|
|
|
|
|
|
D3D11GpuBufferCore(const GPU_BUFFER_DESC& desc, GpuDeviceFlags deviceMask);
|
|
D3D11GpuBufferCore(const GPU_BUFFER_DESC& desc, GpuDeviceFlags deviceMask);
|
|
|
|
|
|
|
|
- /** @copydoc GpuBufferCore::createView */
|
|
|
|
|
- GpuBufferView* createView() override;
|
|
|
|
|
-
|
|
|
|
|
- /** @copydoc GpuBufferCore::destroyView */
|
|
|
|
|
- void destroyView(GpuBufferView* view) override;
|
|
|
|
|
|
|
+ /** Destroys all buffer views regardless if their reference count is zero or not. */
|
|
|
|
|
+ void clearBufferViews();
|
|
|
|
|
|
|
|
/** @copydoc GpuBufferCore::initialize */
|
|
/** @copydoc GpuBufferCore::initialize */
|
|
|
void initialize() override;
|
|
void initialize() override;
|
|
|
|
|
|
|
|
private:
|
|
private:
|
|
|
|
|
+ /** Helper class to help with reference counting for GPU buffer views. */
|
|
|
|
|
+ struct GpuBufferReference
|
|
|
|
|
+ {
|
|
|
|
|
+ GpuBufferReference(GpuBufferView* _view)
|
|
|
|
|
+ :view(_view), refCount(0)
|
|
|
|
|
+ { }
|
|
|
|
|
+
|
|
|
|
|
+ GpuBufferView* view;
|
|
|
|
|
+ UINT32 refCount;
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
D3D11HardwareBuffer* mBuffer;
|
|
D3D11HardwareBuffer* mBuffer;
|
|
|
- D3D11GpuBufferView* mBufferView;
|
|
|
|
|
|
|
+ GpuBufferView* mBufferView;
|
|
|
|
|
+
|
|
|
|
|
+ UnorderedMap<GPU_BUFFER_VIEW_DESC, GpuBufferReference*, GpuBufferView::HashFunction, GpuBufferView::EqualFunction> mBufferViews;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
/** @} */
|
|
/** @} */
|