189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill//
289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill// Use of this source code is governed by a BSD-style license that can be
489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill// found in the LICENSE file.
589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill//
689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill// PixelTransfer11.cpp:
889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill//   Implementation for buffer-to-texture and texture-to-buffer copies.
989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill//   Used to implement pixel transfers from unpack and to pack buffers.
1089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill//
1189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
12c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d11/PixelTransfer11.h"
13c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
14c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d11/renderer11_utils.h"
15c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d11/formatutils11.h"
16d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones#include "libGLESv2/renderer/d3d/d3d11/Buffer11.h"
17c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d11/TextureStorage11.h"
18c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d11/RenderTarget11.h"
190b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include "libGLESv2/formatutils.h"
200b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include "libGLESv2/Texture.h"
210b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include "libGLESv2/Buffer.h"
2289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill#include "libGLESv2/Context.h"
2389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
24851a4f66b1e09696d8f095c1d6a3c2811eb36ebbJamie Madill// Precompiled shaders
25c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h"
26c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_gs.h"
27c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4f.h"
28c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4i.h"
29c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4ui.h"
30851a4f66b1e09696d8f095c1d6a3c2811eb36ebbJamie Madill
3189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madillnamespace rx
3289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill{
3389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
3489a0bf50056591b074b89ce13032a75d1a5d757bJamie MadillPixelTransfer11::PixelTransfer11(Renderer11 *renderer)
3589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    : mRenderer(renderer),
3689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill      mBufferToTextureVS(NULL),
3789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill      mBufferToTextureGS(NULL),
3889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill      mParamsConstantBuffer(NULL),
3989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill      mCopyRasterizerState(NULL),
4089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill      mCopyDepthStencilState(NULL)
4189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill{
4289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    HRESULT result = S_OK;
4389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ID3D11Device *device = mRenderer->getDevice();
4489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
4589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    D3D11_RASTERIZER_DESC rasterDesc;
4689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    rasterDesc.FillMode = D3D11_FILL_SOLID;
4789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    rasterDesc.CullMode = D3D11_CULL_NONE;
4889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    rasterDesc.FrontCounterClockwise = FALSE;
4989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    rasterDesc.DepthBias = 0;
5089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    rasterDesc.SlopeScaledDepthBias = 0.0f;
5189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    rasterDesc.DepthBiasClamp = 0.0f;
5289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    rasterDesc.DepthClipEnable = TRUE;
5389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    rasterDesc.ScissorEnable = FALSE;
5489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    rasterDesc.MultisampleEnable = FALSE;
5589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    rasterDesc.AntialiasedLineEnable = FALSE;
5689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
5789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    result = device->CreateRasterizerState(&rasterDesc, &mCopyRasterizerState);
5889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ASSERT(SUCCEEDED(result));
5989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
6089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
6189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    depthStencilDesc.DepthEnable = true;
6289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
6389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    depthStencilDesc.DepthFunc = D3D11_COMPARISON_ALWAYS;
6489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    depthStencilDesc.StencilEnable = FALSE;
6589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    depthStencilDesc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK;
6689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    depthStencilDesc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK;
6789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
6889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
6989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
7089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
7189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
7289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
7389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
7489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
7589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
7689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    result = device->CreateDepthStencilState(&depthStencilDesc, &mCopyDepthStencilState);
7789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ASSERT(SUCCEEDED(result));
7889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
7989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    D3D11_BUFFER_DESC constantBufferDesc = { 0 };
80036aa49b629f2a4ff1f0bcaa298dbdb875af6442Geoff Lang    constantBufferDesc.ByteWidth = rx::roundUp<UINT>(sizeof(CopyShaderParams), 32u);
8189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    constantBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
8289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    constantBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
8389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    constantBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
8489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    constantBufferDesc.MiscFlags = 0;
8589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    constantBufferDesc.StructureByteStride = 0;
8689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
8789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    result = device->CreateBuffer(&constantBufferDesc, NULL, &mParamsConstantBuffer);
8889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ASSERT(SUCCEEDED(result));
8989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    d3d11::SetDebugName(mParamsConstantBuffer, "PixelTransfer11 constant buffer");
9089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
91851a4f66b1e09696d8f095c1d6a3c2811eb36ebbJamie Madill    // init shaders
92851a4f66b1e09696d8f095c1d6a3c2811eb36ebbJamie Madill    mBufferToTextureVS = d3d11::CompileVS(device, g_VS_BufferToTexture, "BufferToTexture VS");
9353683053c46f7c7a2e86b4a22fa729545595af3bJamie Madill    mBufferToTextureGS = d3d11::CompileGS(device, g_GS_BufferToTexture, "BufferToTexture GS");
9489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
9589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    buildShaderMap();
9689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
9789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    StructZero(&mParamsData);
9889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill}
9989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
10089a0bf50056591b074b89ce13032a75d1a5d757bJamie MadillPixelTransfer11::~PixelTransfer11()
10189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill{
10289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    for (auto shaderMapIt = mBufferToTexturePSMap.begin(); shaderMapIt != mBufferToTexturePSMap.end(); shaderMapIt++)
10389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    {
10489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill        SafeRelease(shaderMapIt->second);
10589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    }
10689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
10789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    mBufferToTexturePSMap.clear();
10889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
10989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    SafeRelease(mBufferToTextureVS);
11089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    SafeRelease(mBufferToTextureGS);
11189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    SafeRelease(mParamsConstantBuffer);
11289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    SafeRelease(mCopyRasterizerState);
11389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    SafeRelease(mCopyDepthStencilState);
11489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill}
11589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
11689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madillvoid PixelTransfer11::setBufferToTextureCopyParams(const gl::Box &destArea, const gl::Extents &destSize, GLenum internalFormat,
11789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill                                                   const gl::PixelUnpackState &unpack, unsigned int offset, CopyShaderParams *parametersOut)
11889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill{
11989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    StructZero(parametersOut);
12089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
12189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    float texelCenterX = 0.5f / static_cast<float>(destSize.width - 1);
12289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    float texelCenterY = 0.5f / static_cast<float>(destSize.height - 1);
12389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
1245d601382b51c29d1670b58c01360416bd929842dGeoff Lang    unsigned int bytesPerPixel = gl::GetInternalFormatInfo(internalFormat).pixelBytes;
12589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    unsigned int alignmentBytes = static_cast<unsigned int>(unpack.alignment);
12689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    unsigned int alignmentPixels = (alignmentBytes <= bytesPerPixel ? 1 : alignmentBytes / bytesPerPixel);
12789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
12889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    parametersOut->FirstPixelOffset     = offset;
12989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    parametersOut->PixelsPerRow         = static_cast<unsigned int>(destArea.width);
13089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    parametersOut->RowStride            = roundUp(parametersOut->PixelsPerRow, alignmentPixels);
13189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    parametersOut->RowsPerSlice         = static_cast<unsigned int>(destArea.height);
13289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    parametersOut->PositionOffset[0]    = texelCenterX + (destArea.x / float(destSize.width)) * 2.0f - 1.0f;
13389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    parametersOut->PositionOffset[1]    = texelCenterY + ((destSize.height - destArea.y - 1) / float(destSize.height)) * 2.0f - 1.0f;
13489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    parametersOut->PositionScale[0]     = 2.0f / static_cast<float>(destSize.width);
13589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    parametersOut->PositionScale[1]     = -2.0f / static_cast<float>(destSize.height);
13689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill}
13789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
13889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madillbool PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpack, unsigned int offset, RenderTarget *destRenderTarget,
13989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill                                          GLenum destinationFormat, GLenum sourcePixelsType, const gl::Box &destArea)
14089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill{
14189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    gl::Extents destSize = destRenderTarget->getExtents();
14289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
14389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    if (destArea.x   < 0 || destArea.x   + destArea.width    > destSize.width    ||
14489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill        destArea.y   < 0 || destArea.y   + destArea.height   > destSize.height   ||
14589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill        destArea.z   < 0 || destArea.z   + destArea.depth    > destSize.depth    )
14689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    {
14789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill        return false;
14889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    }
14989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
15089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    const gl::Buffer &sourceBuffer = *unpack.pixelBuffer.get();
15189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
1520e0510fd08426f39f104c5dc937c9d7f4469db95Jamie Madill    ASSERT(mRenderer->supportsFastCopyBufferToTexture(destinationFormat));
15389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
15489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ID3D11PixelShader *pixelShader = findBufferToTexturePS(destinationFormat);
15589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ASSERT(pixelShader);
15689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
15789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    // The SRV must be in the proper read format, which may be different from the destination format
15889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    // EG: for half float data, we can load full precision floats with implicit conversion
1595d601382b51c29d1670b58c01360416bd929842dGeoff Lang    GLenum unsizedFormat = gl::GetInternalFormatInfo(destinationFormat).format;
1605d601382b51c29d1670b58c01360416bd929842dGeoff Lang    GLenum sourceFormat = gl::GetFormatTypeInfo(unsizedFormat, sourcePixelsType).internalFormat;
16189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
1629aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    const d3d11::TextureFormat &sourceFormatInfo = d3d11::GetTextureFormatInfo(sourceFormat);
1639aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    DXGI_FORMAT srvFormat = sourceFormatInfo.srvFormat;
16489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ASSERT(srvFormat != DXGI_FORMAT_UNKNOWN);
165d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    Buffer11 *bufferStorage11 = Buffer11::makeBuffer11(sourceBuffer.getImplementation());
16689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ID3D11ShaderResourceView *bufferSRV = bufferStorage11->getSRV(srvFormat);
16789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ASSERT(bufferSRV != NULL);
16889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
16989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ID3D11RenderTargetView *textureRTV = RenderTarget11::makeRenderTarget11(destRenderTarget)->getRenderTargetView();
17089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ASSERT(textureRTV != NULL);
17189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
17289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    CopyShaderParams shaderParams;
17389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    setBufferToTextureCopyParams(destArea, destSize, sourceFormat, unpack, offset, &shaderParams);
17489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
17589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
17689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
17789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ID3D11ShaderResourceView *nullSRV = NULL;
17889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ID3D11Buffer *nullBuffer = NULL;
17989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    UINT zero = 0;
18089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
18189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    // Are we doing a 2D or 3D copy?
18289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    ID3D11GeometryShader *geometryShader = ((destSize.depth > 1) ? mBufferToTextureGS : NULL);
18389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
18489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->VSSetShader(mBufferToTextureVS, NULL, 0);
18589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->GSSetShader(geometryShader, NULL, 0);
18689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->PSSetShader(pixelShader, NULL, 0);
18789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->PSSetShaderResources(0, 1, &bufferSRV);
18889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->IASetInputLayout(NULL);
18989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
19089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
19189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->IASetVertexBuffers(0, 1, &nullBuffer, &zero, &zero);
19289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->OMSetBlendState(NULL, NULL, 0xFFFFFFF);
19389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->OMSetDepthStencilState(mCopyDepthStencilState, 0xFFFFFFFF);
19489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->RSSetState(mCopyRasterizerState);
19589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
19689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    mRenderer->setOneTimeRenderTarget(textureRTV);
19789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
19889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    if (!StructEquals(mParamsData, shaderParams))
19989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    {
20089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill        d3d11::SetBufferData(deviceContext, mParamsConstantBuffer, shaderParams);
20189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill        mParamsData = shaderParams;
20289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    }
20389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
20489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->VSSetConstantBuffers(0, 1, &mParamsConstantBuffer);
20589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
20689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    // Set the viewport
20789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    D3D11_VIEWPORT viewport;
20889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    viewport.TopLeftX = 0;
20989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    viewport.TopLeftY = 0;
21089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    viewport.Width = destSize.width;
21189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    viewport.Height = destSize.height;
21289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    viewport.MinDepth = 0.0f;
21389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    viewport.MaxDepth = 1.0f;
21489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->RSSetViewports(1, &viewport);
21589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
21689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    UINT numPixels = (destArea.width * destArea.height * destArea.depth);
21789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->Draw(numPixels, 0);
21889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
21989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    // Unbind textures and render targets and vertex buffer
22089a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->PSSetShaderResources(0, 1, &nullSRV);
22189a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    deviceContext->VSSetConstantBuffers(0, 1, &nullBuffer);
22289a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
22389a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    mRenderer->markAllStateDirty();
22489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
22589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    return true;
22689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill}
22789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
22889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madillvoid PixelTransfer11::buildShaderMap()
22989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill{
230851a4f66b1e09696d8f095c1d6a3c2811eb36ebbJamie Madill    ID3D11Device *device = mRenderer->getDevice();
231851a4f66b1e09696d8f095c1d6a3c2811eb36ebbJamie Madill
23224112d686998dc202ba559d186f342a2de42fbecJamie Madill    mBufferToTexturePSMap[GL_FLOAT]        = d3d11::CompilePS(device, g_PS_BufferToTexture_4F,  "BufferToTexture RGBA ps");
23324112d686998dc202ba559d186f342a2de42fbecJamie Madill    mBufferToTexturePSMap[GL_INT]          = d3d11::CompilePS(device, g_PS_BufferToTexture_4I,  "BufferToTexture RGBA-I ps");
23424112d686998dc202ba559d186f342a2de42fbecJamie Madill    mBufferToTexturePSMap[GL_UNSIGNED_INT] = d3d11::CompilePS(device, g_PS_BufferToTexture_4UI, "BufferToTexture RGBA-UI ps");
23589a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill}
23689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
23789a0bf50056591b074b89ce13032a75d1a5d757bJamie MadillID3D11PixelShader *PixelTransfer11::findBufferToTexturePS(GLenum internalFormat) const
23889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill{
2395d601382b51c29d1670b58c01360416bd929842dGeoff Lang    GLenum componentType = gl::GetInternalFormatInfo(internalFormat).componentType;
24024112d686998dc202ba559d186f342a2de42fbecJamie Madill    if (componentType == GL_SIGNED_NORMALIZED || componentType == GL_UNSIGNED_NORMALIZED)
24124112d686998dc202ba559d186f342a2de42fbecJamie Madill    {
24224112d686998dc202ba559d186f342a2de42fbecJamie Madill        componentType = GL_FLOAT;
24324112d686998dc202ba559d186f342a2de42fbecJamie Madill    }
24489a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
24524112d686998dc202ba559d186f342a2de42fbecJamie Madill    auto shaderMapIt = mBufferToTexturePSMap.find(componentType);
24689a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill    return (shaderMapIt == mBufferToTexturePSMap.end() ? NULL : shaderMapIt->second);
24789a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill}
24889a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill
24989a0bf50056591b074b89ce13032a75d1a5d757bJamie Madill}
250