Commit 4461f097 by Jamie Madill

Add support for the "fast path" (GPU copy) pixel unpack buffers in TexImage2D.

TRAC #23844 Signed-off-by: Geoff Lang Signed-off-by: Shannon Woods
parent 171ca0ea
......@@ -10,6 +10,7 @@
#include "libGLESv2/renderer/d3d11/BufferStorage11.h"
#include "libGLESv2/main.h"
#include "libGLESv2/renderer/d3d11/Renderer11.h"
#include "libGLESv2/renderer/d3d11/formatutils11.h"
namespace rx
{
......@@ -268,7 +269,38 @@ ID3D11Buffer *BufferStorage11::getBuffer(bool isConstantBufferUsage)
ID3D11ShaderResourceView *BufferStorage11::getSRV(DXGI_FORMAT srvFormat)
{
return NULL;
ID3D11Buffer *buffer = getBuffer(false);
auto bufferSRVIt = mBufferResourceViews.find(srvFormat);
if (bufferSRVIt != mBufferResourceViews.end())
{
if (bufferSRVIt->second.first == buffer)
{
return bufferSRVIt->second.second;
}
else
{
// The underlying buffer has changed since the SRV was created: recreate the SRV.
SafeRelease(bufferSRVIt->second.second);
}
}
ID3D11Device *device = mRenderer->getDevice();
ID3D11ShaderResourceView *bufferSRV = NULL;
D3D11_SHADER_RESOURCE_VIEW_DESC bufferSRVDesc;
bufferSRVDesc.Buffer.ElementOffset = 0;
bufferSRVDesc.Buffer.ElementWidth = mSize / d3d11::GetFormatPixelBytes(srvFormat, mRenderer->getCurrentClientVersion());
bufferSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
bufferSRVDesc.Format = srvFormat;
HRESULT result = device->CreateShaderResourceView(buffer, &bufferSRVDesc, &bufferSRV);
ASSERT(SUCCEEDED(result));
mBufferResourceViews[srvFormat] = BufferSRVPair(buffer, bufferSRV);
return bufferSRV;
}
DirectBufferStorage11::DirectBufferStorage11(Renderer11 *renderer, bool isConstantBufferUsage)
......@@ -352,7 +384,7 @@ void DirectBufferStorage11::fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, unsign
if (!mIsConstantBufferUsage)
{
bufferDesc->Usage = D3D11_USAGE_DEFAULT;
bufferDesc->BindFlags = D3D11_BIND_INDEX_BUFFER | D3D11_BIND_VERTEX_BUFFER;
bufferDesc->BindFlags = D3D11_BIND_INDEX_BUFFER | D3D11_BIND_VERTEX_BUFFER | D3D11_BIND_SHADER_RESOURCE;
bufferDesc->CPUAccessFlags = 0;
}
else
......
......@@ -42,6 +42,10 @@ class BufferStorage11 : public BufferStorage
unsigned int mStagingBufferSize;
std::vector<DirectBufferStorage11*> mDirectBuffers;
typedef std::pair<ID3D11Buffer *, ID3D11ShaderResourceView *> BufferSRVPair;
std::map<DXGI_FORMAT, BufferSRVPair> mBufferResourceViews;
unsigned int mSize;
void *mResolvedData;
......
......@@ -2769,8 +2769,39 @@ FenceImpl *Renderer11::createFence()
bool Renderer11::supportsFastCopyBufferToTexture(GLint internalFormat) const
{
//TODO
return false;
int clientVersion = getCurrentClientVersion();
// We only support buffer to texture copies in ES3
if (clientVersion <= 2)
{
return false;
}
// sRGB formats do not work with D3D11 buffer SRVs
if (gl::GetColorEncoding(internalFormat, clientVersion) == GL_SRGB)
{
return false;
}
// We cannot support direct copies to non-color-renderable formats
if (!gl::IsColorRenderingSupported(internalFormat, this))
{
return false;
}
// We skip all 3-channel formats since sometimes format support is missing
if (gl::GetComponentCount(internalFormat, clientVersion) == 3)
{
return false;
}
// We don't support formats which we can't represent without conversion
if (getNativeTextureFormat(internalFormat) != internalFormat)
{
return false;
}
return true;
}
bool Renderer11::fastCopyBufferToTexture(const gl::PixelUnpackState &unpack, unsigned int offset, RenderTarget *destRenderTarget,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment