summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h')
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h174
1 files changed, 112 insertions, 62 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
index a748db57ae..ddbeeb90d2 100644
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
+++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
@@ -9,10 +9,12 @@
#ifndef LIBANGLE_RENDERER_D3D_D3D11_BUFFER11_H_
#define LIBANGLE_RENDERER_D3D_D3D11_BUFFER11_H_
+#include <array>
#include <map>
#include "libANGLE/angletypes.h"
#include "libANGLE/renderer/d3d/BufferD3D.h"
+#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
namespace gl
{
@@ -21,69 +23,92 @@ class FramebufferAttachment;
namespace rx
{
+struct PackPixelsParams;
class Renderer11;
struct SourceIndexData;
struct TranslatedAttribute;
+// The order of this enum governs priority of 'getLatestBufferStorage'.
enum BufferUsage
{
+ BUFFER_USAGE_SYSTEM_MEMORY,
BUFFER_USAGE_STAGING,
BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK,
BUFFER_USAGE_INDEX,
+ // TODO: possibly share this buffer type with shader storage buffers.
+ BUFFER_USAGE_INDIRECT,
BUFFER_USAGE_PIXEL_UNPACK,
BUFFER_USAGE_PIXEL_PACK,
BUFFER_USAGE_UNIFORM,
- BUFFER_USAGE_SYSTEM_MEMORY,
BUFFER_USAGE_EMULATED_INDEXED_VERTEX,
BUFFER_USAGE_COUNT,
};
-struct PackPixelsParams
-{
- PackPixelsParams();
- PackPixelsParams(const gl::Rectangle &area, GLenum format, GLenum type, GLuint outputPitch,
- const gl::PixelPackState &pack, ptrdiff_t offset);
-
- gl::Rectangle area;
- GLenum format;
- GLenum type;
- GLuint outputPitch;
- gl::Buffer *packBuffer;
- gl::PixelPackState pack;
- ptrdiff_t offset;
-};
-
typedef size_t DataRevision;
class Buffer11 : public BufferD3D
{
public:
- Buffer11(Renderer11 *renderer);
- virtual ~Buffer11();
-
- ID3D11Buffer *getBuffer(BufferUsage usage);
- ID3D11Buffer *getEmulatedIndexedBuffer(SourceIndexData *indexInfo, const TranslatedAttribute *attribute);
- ID3D11Buffer *getConstantBufferRange(GLintptr offset, GLsizeiptr size);
- ID3D11ShaderResourceView *getSRV(DXGI_FORMAT srvFormat);
- bool isMapped() const { return mMappedStorage != NULL; }
- gl::Error packPixels(const gl::FramebufferAttachment &readAttachment,
+ Buffer11(const gl::BufferState &state, Renderer11 *renderer);
+ ~Buffer11() override;
+
+ gl::ErrorOrResult<ID3D11Buffer *> getBuffer(const gl::Context *context, BufferUsage usage);
+ gl::ErrorOrResult<ID3D11Buffer *> getEmulatedIndexedBuffer(const gl::Context *context,
+ SourceIndexData *indexInfo,
+ const TranslatedAttribute &attribute,
+ GLint startVertex);
+ gl::Error getConstantBufferRange(const gl::Context *context,
+ GLintptr offset,
+ GLsizeiptr size,
+ const d3d11::Buffer **bufferOut,
+ UINT *firstConstantOut,
+ UINT *numConstantsOut);
+ gl::ErrorOrResult<const d3d11::ShaderResourceView *> getSRV(const gl::Context *context,
+ DXGI_FORMAT srvFormat);
+ bool isMapped() const { return mMappedStorage != nullptr; }
+ gl::Error packPixels(const gl::Context *context,
+ const gl::FramebufferAttachment &readAttachment,
const PackPixelsParams &params);
size_t getTotalCPUBufferMemoryBytes() const;
// BufferD3D implementation
- virtual size_t getSize() const { return mSize; }
- virtual bool supportsDirectBinding() const;
- gl::Error getData(const uint8_t **outData) override;
+ size_t getSize() const override;
+ bool supportsDirectBinding() const override;
+ gl::Error getData(const gl::Context *context, const uint8_t **outData) override;
+ void initializeStaticData(const gl::Context *context) override;
+ void invalidateStaticData(const gl::Context *context) override;
// BufferImpl implementation
- virtual gl::Error setData(const void* data, size_t size, GLenum usage);
- virtual gl::Error setSubData(const void* data, size_t size, size_t offset);
- virtual gl::Error copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size);
- virtual gl::Error map(GLenum access, GLvoid **mapPtr);
- virtual gl::Error mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr);
- virtual gl::Error unmap(GLboolean *result);
- virtual void markTransformFeedbackUsage();
+ gl::Error setData(const gl::Context *context,
+ gl::BufferBinding target,
+ const void *data,
+ size_t size,
+ gl::BufferUsage usage) override;
+ gl::Error setSubData(const gl::Context *context,
+ gl::BufferBinding target,
+ const void *data,
+ size_t size,
+ size_t offset) override;
+ gl::Error copySubData(const gl::Context *context,
+ BufferImpl *source,
+ GLintptr sourceOffset,
+ GLintptr destOffset,
+ GLsizeiptr size) override;
+ gl::Error map(const gl::Context *context, GLenum access, void **mapPtr) override;
+ gl::Error mapRange(const gl::Context *context,
+ size_t offset,
+ size_t length,
+ GLbitfield access,
+ void **mapPtr) override;
+ gl::Error unmap(const gl::Context *context, GLboolean *result) override;
+ gl::Error markTransformFeedbackUsage(const gl::Context *context) override;
+
+ // We use two set of dirty events. Static buffers are marked dirty whenever
+ // data changes, because they must be re-translated. Direct buffers only need to be
+ // updated when the underlying ID3D11Buffer pointer changes - hopefully far less often.
+ OnBufferDataDirtyChannel *getStaticBroadcastChannel();
+ OnBufferDataDirtyChannel *getDirectBroadcastChannel();
private:
class BufferStorage;
@@ -92,21 +117,61 @@ class Buffer11 : public BufferD3D
class PackStorage;
class SystemMemoryStorage;
- Renderer11 *mRenderer;
- size_t mSize;
-
- BufferStorage *mMappedStorage;
-
- std::vector<BufferStorage*> mBufferStorages;
-
struct ConstantBufferCacheEntry
{
- ConstantBufferCacheEntry() : storage(nullptr), lruCount(0) { }
+ ConstantBufferCacheEntry() : storage(nullptr), lruCount(0) {}
BufferStorage *storage;
unsigned int lruCount;
};
+ void markBufferUsage(BufferUsage usage);
+ gl::Error garbageCollection(const gl::Context *context, BufferUsage currentUsage);
+ gl::ErrorOrResult<NativeStorage *> getStagingStorage(const gl::Context *context);
+ gl::ErrorOrResult<PackStorage *> getPackStorage(const gl::Context *context);
+ gl::ErrorOrResult<SystemMemoryStorage *> getSystemMemoryStorage(const gl::Context *context);
+
+ gl::Error updateBufferStorage(const gl::Context *context,
+ BufferStorage *storage,
+ size_t sourceOffset,
+ size_t storageSize);
+ gl::ErrorOrResult<BufferStorage *> getBufferStorage(const gl::Context *context,
+ BufferUsage usage);
+ gl::ErrorOrResult<BufferStorage *> getLatestBufferStorage(const gl::Context *context) const;
+
+ gl::ErrorOrResult<BufferStorage *> getConstantBufferRangeStorage(const gl::Context *context,
+ GLintptr offset,
+ GLsizeiptr size);
+
+ BufferStorage *allocateStorage(BufferUsage usage);
+ void updateDeallocThreshold(BufferUsage usage);
+
+ // Free the storage if we decide it isn't being used very often.
+ gl::Error checkForDeallocation(const gl::Context *context, BufferUsage usage);
+
+ // For some cases of uniform buffer storage, we can't deallocate system memory storage.
+ bool canDeallocateSystemMemory() const;
+
+ // Updates data revisions and latest storage.
+ void onCopyStorage(BufferStorage *dest, BufferStorage *source);
+ void onStorageUpdate(BufferStorage *updatedStorage);
+
+ Renderer11 *mRenderer;
+ size_t mSize;
+
+ BufferStorage *mMappedStorage;
+
+ // Buffer storages are sorted by usage. It's important that the latest buffer storage picks
+ // the lowest usage in the case where two storages are tied on data revision - this ensures
+ // we never do anything dangerous like map a uniform buffer over a staging or system memory
+ // copy.
+ std::array<BufferStorage *, BUFFER_USAGE_COUNT> mBufferStorages;
+ BufferStorage *mLatestBufferStorage;
+
+ // These two arrays are used to track when to free unused storage.
+ std::array<unsigned int, BUFFER_USAGE_COUNT> mDeallocThresholds;
+ std::array<unsigned int, BUFFER_USAGE_COUNT> mIdleness;
+
// Cache of D3D11 constant buffer for specific ranges of buffer data.
// This is used to emulate UBO ranges on 11.0 devices.
// Constant buffers are indexed by there start offset.
@@ -115,25 +180,10 @@ class Buffer11 : public BufferD3D
size_t mConstantBufferStorageAdditionalSize;
unsigned int mMaxConstantBufferLruCount;
- typedef std::pair<ID3D11Buffer *, ID3D11ShaderResourceView *> BufferSRVPair;
- std::map<DXGI_FORMAT, BufferSRVPair> mBufferResourceViews;
-
- unsigned int mReadUsageCount;
-
- void markBufferUsage();
- NativeStorage *getStagingStorage();
- PackStorage *getPackStorage();
- gl::Error getSystemMemoryStorage(SystemMemoryStorage **storageOut);
-
- void updateBufferStorage(BufferStorage *storage, size_t sourceOffset, size_t storageSize);
- BufferStorage *getBufferStorage(BufferUsage usage);
- BufferStorage *getLatestBufferStorage() const;
-
- BufferStorage *getConstantBufferRangeStorage(GLintptr offset, GLsizeiptr size);
-
- void invalidateEmulatedIndexedBuffer();
+ OnBufferDataDirtyChannel mStaticBroadcastChannel;
+ OnBufferDataDirtyChannel mDirectBroadcastChannel;
};
-}
+} // namespace rx
-#endif // LIBANGLE_RENDERER_D3D_D3D11_BUFFER11_H_
+#endif // LIBANGLE_RENDERER_D3D_D3D11_BUFFER11_H_