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