1 // 2 // Copyright 2014 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 // Buffer11.h: Defines the rx::Buffer11 class which implements rx::BufferImpl via rx::BufferD3D. 8 9 #ifndef LIBGLESV2_RENDERER_BUFFER11_H_ 10 #define LIBGLESV2_RENDERER_BUFFER11_H_ 11 12 #include "libGLESv2/renderer/d3d/BufferD3D.h" 13 #include "libGLESv2/renderer/d3d/MemoryBuffer.h" 14 #include "libGLESv2/angletypes.h" 15 16 namespace rx 17 { 18 class Renderer11; 19 20 enum BufferUsage 21 { 22 BUFFER_USAGE_STAGING, 23 BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK, 24 BUFFER_USAGE_INDEX, 25 BUFFER_USAGE_PIXEL_UNPACK, 26 BUFFER_USAGE_PIXEL_PACK, 27 BUFFER_USAGE_UNIFORM, 28 }; 29 30 struct PackPixelsParams 31 { 32 PackPixelsParams(); 33 PackPixelsParams(const gl::Rectangle &area, GLenum format, GLenum type, GLuint outputPitch, 34 const gl::PixelPackState &pack, ptrdiff_t offset); 35 36 gl::Rectangle area; 37 GLenum format; 38 GLenum type; 39 GLuint outputPitch; 40 gl::Buffer *packBuffer; 41 gl::PixelPackState pack; 42 ptrdiff_t offset; 43 }; 44 45 typedef size_t DataRevision; 46 47 class Buffer11 : public BufferD3D 48 { 49 public: 50 Buffer11(rx::Renderer11 *renderer); 51 virtual ~Buffer11(); 52 53 static Buffer11 *makeBuffer11(BufferImpl *buffer); 54 55 ID3D11Buffer *getBuffer(BufferUsage usage); 56 ID3D11ShaderResourceView *getSRV(DXGI_FORMAT srvFormat); 57 bool isMapped() const { return mMappedStorage != NULL; } 58 gl::Error packPixels(ID3D11Texture2D *srcTexure, UINT srcSubresource, const PackPixelsParams ¶ms); 59 60 // BufferD3D implementation 61 virtual size_t getSize() const { return mSize; } 62 virtual bool supportsDirectBinding() const; 63 virtual Renderer* getRenderer(); 64 65 // BufferImpl implementation 66 virtual gl::Error setData(const void* data, size_t size, GLenum usage); 67 virtual void *getData(); 68 virtual gl::Error setSubData(const void* data, size_t size, size_t offset); 69 virtual gl::Error copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size); 70 virtual gl::Error map(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr); 71 virtual gl::Error unmap(); 72 virtual void markTransformFeedbackUsage(); 73 74 private: 75 DISALLOW_COPY_AND_ASSIGN(Buffer11); 76 77 class BufferStorage11; 78 class NativeBuffer11; 79 class PackStorage11; 80 81 rx::Renderer11 *mRenderer; 82 size_t mSize; 83 84 BufferStorage11 *mMappedStorage; 85 86 std::map<BufferUsage, BufferStorage11*> mBufferStorages; 87 88 typedef std::pair<ID3D11Buffer *, ID3D11ShaderResourceView *> BufferSRVPair; 89 std::map<DXGI_FORMAT, BufferSRVPair> mBufferResourceViews; 90 91 MemoryBuffer mResolvedData; 92 DataRevision mResolvedDataRevision; 93 unsigned int mReadUsageCount; 94 95 void markBufferUsage(); 96 NativeBuffer11 *getStagingBuffer(); 97 PackStorage11 *getPackStorage(); 98 99 BufferStorage11 *getBufferStorage(BufferUsage usage); 100 BufferStorage11 *getLatestBufferStorage() const; 101 }; 102 103 } 104 105 #endif // LIBGLESV2_RENDERER_BUFFER11_H_ 106