Home | History | Annotate | Download | only in d3d11
      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 &params);
     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