1//
2// Copyright (c) 2013 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// PixelTransfer11.h:
8//   Buffer-to-Texture and Texture-to-Buffer data transfers.
9//   Used to implement pixel unpack and pixel pack buffers in ES3.
10
11#ifndef LIBGLESV2_PIXELTRANSFER11_H_
12#define LIBGLESV2_PIXELTRANSFER11_H_
13
14#include "common/platform.h"
15
16#include <GLES2/gl2.h>
17
18#include <map>
19
20namespace gl
21{
22
23class Buffer;
24struct Box;
25struct Extents;
26struct PixelUnpackState;
27
28}
29
30namespace rx
31{
32class Renderer11;
33class RenderTarget;
34
35class PixelTransfer11
36{
37  public:
38    explicit PixelTransfer11(Renderer11 *renderer);
39    ~PixelTransfer11();
40
41    static bool supportsBufferToTextureCopy(GLenum internalFormat);
42
43    // unpack: the source buffer is stored in the unpack state, and buffer strides
44    // offset: the start of the data within the unpack buffer
45    // destRenderTarget: individual slice/layer of a target texture
46    // destinationFormat/sourcePixelsType: determines shaders + shader parameters
47    // destArea: the sub-section of destRenderTarget to copy to
48    bool copyBufferToTexture(const gl::PixelUnpackState &unpack, unsigned int offset, RenderTarget *destRenderTarget,
49                             GLenum destinationFormat, GLenum sourcePixelsType, const gl::Box &destArea);
50
51  private:
52
53    struct CopyShaderParams
54    {
55        unsigned int FirstPixelOffset;
56        unsigned int PixelsPerRow;
57        unsigned int RowStride;
58        unsigned int RowsPerSlice;
59        float PositionOffset[2];
60        float PositionScale[2];
61        int TexLocationOffset[2];
62        int TexLocationScale[2];
63    };
64
65    static void setBufferToTextureCopyParams(const gl::Box &destArea, const gl::Extents &destSize, GLenum internalFormat,
66                                             const gl::PixelUnpackState &unpack, unsigned int offset, CopyShaderParams *parametersOut);
67
68    void buildShaderMap();
69    ID3D11PixelShader *findBufferToTexturePS(GLenum internalFormat) const;
70
71    Renderer11 *mRenderer;
72
73    std::map<GLenum, ID3D11PixelShader *> mBufferToTexturePSMap;
74    ID3D11VertexShader *mBufferToTextureVS;
75    ID3D11GeometryShader *mBufferToTextureGS;
76    ID3D11Buffer *mParamsConstantBuffer;
77    CopyShaderParams mParamsData;
78
79    ID3D11RasterizerState *mCopyRasterizerState;
80    ID3D11DepthStencilState *mCopyDepthStencilState;
81
82};
83
84}
85
86#endif // LIBGLESV2_PIXELTRANSFER11_H_
87