Commit 4305fea1 by Jamie Madill

Add a pack buffer storage to BufferStorage11.

This new storage implementation uses CPU memory to read back pixel data from a texture. We use this class to implement pack buffers for asynchronous pixel readback. BUG=angle:511 Change-Id: Ifebd242047291af6b34c981231b69987b87d290d Reviewed-on: https://chromium-review.googlesource.com/193243Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 1deca4fd
...@@ -72,7 +72,7 @@ class BufferStorage11::TypedBufferStorage11 ...@@ -72,7 +72,7 @@ class BufferStorage11::TypedBufferStorage11
virtual void *map(GLbitfield access) = 0; virtual void *map(GLbitfield access) = 0;
virtual void unmap() = 0; virtual void unmap() = 0;
protected: protected:
TypedBufferStorage11(Renderer11 *renderer, BufferUsage usage); TypedBufferStorage11(Renderer11 *renderer, BufferUsage usage);
Renderer11 *mRenderer; Renderer11 *mRenderer;
...@@ -98,12 +98,32 @@ class BufferStorage11::NativeBuffer11 : public BufferStorage11::TypedBufferStora ...@@ -98,12 +98,32 @@ class BufferStorage11::NativeBuffer11 : public BufferStorage11::TypedBufferStora
virtual void *map(GLbitfield access); virtual void *map(GLbitfield access);
virtual void unmap(); virtual void unmap();
private: private:
ID3D11Buffer *mNativeBuffer; ID3D11Buffer *mNativeBuffer;
static void fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, Renderer *renderer, BufferUsage usage, unsigned int bufferSize); static void fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, Renderer *renderer, BufferUsage usage, unsigned int bufferSize);
}; };
// Pack storage represents internal storage for pack buffers. We implement pack buffers
// as CPU memory, tied to a staging texture, for asynchronous texture readback.
class BufferStorage11::PackStorage11 : public BufferStorage11::TypedBufferStorage11
{
public:
PackStorage11(Renderer11 *renderer);
~PackStorage11();
virtual bool copyFromStorage(TypedBufferStorage11 *source, size_t sourceOffset,
size_t size, size_t destOffset);
virtual void resize(size_t size, bool preserveData);
virtual void *map(GLbitfield access);
virtual void unmap();
private:
ID3D11Texture2D *mStagingTexture;
unsigned char *mMemoryBuffer;
};
BufferStorage11::BufferStorage11(Renderer11 *renderer) BufferStorage11::BufferStorage11(Renderer11 *renderer)
: mRenderer(renderer), : mRenderer(renderer),
mIsMapped(false), mIsMapped(false),
...@@ -533,4 +553,40 @@ void BufferStorage11::NativeBuffer11::unmap() ...@@ -533,4 +553,40 @@ void BufferStorage11::NativeBuffer11::unmap()
context->Unmap(mNativeBuffer, 0); context->Unmap(mNativeBuffer, 0);
} }
BufferStorage11::PackStorage11::PackStorage11(Renderer11 *renderer)
: TypedBufferStorage11(renderer, BUFFER_USAGE_PIXEL_PACK),
mStagingTexture(NULL),
mMemoryBuffer(NULL)
{
}
BufferStorage11::PackStorage11::~PackStorage11()
{
SafeRelease(mStagingTexture);
SafeDeleteArray(mMemoryBuffer);
}
bool BufferStorage11::PackStorage11::copyFromStorage(TypedBufferStorage11 *source, size_t sourceOffset,
size_t size, size_t destOffset)
{
UNIMPLEMENTED();
return false;
}
void BufferStorage11::PackStorage11::resize(size_t size, bool preserveData)
{
UNIMPLEMENTED();
}
void *BufferStorage11::PackStorage11::map(GLbitfield access)
{
UNIMPLEMENTED();
return NULL;
}
void BufferStorage11::PackStorage11::unmap()
{
UNIMPLEMENTED();
}
} }
...@@ -22,6 +22,7 @@ enum BufferUsage ...@@ -22,6 +22,7 @@ enum BufferUsage
BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK,
BUFFER_USAGE_INDEX, BUFFER_USAGE_INDEX,
BUFFER_USAGE_PIXEL_UNPACK, BUFFER_USAGE_PIXEL_UNPACK,
BUFFER_USAGE_PIXEL_PACK,
BUFFER_USAGE_UNIFORM, BUFFER_USAGE_UNIFORM,
}; };
...@@ -54,6 +55,7 @@ class BufferStorage11 : public BufferStorage ...@@ -54,6 +55,7 @@ class BufferStorage11 : public BufferStorage
private: private:
class TypedBufferStorage11; class TypedBufferStorage11;
class NativeBuffer11; class NativeBuffer11;
class PackStorage11;
Renderer11 *mRenderer; Renderer11 *mRenderer;
bool mIsMapped; bool mIsMapped;
......
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