Commit 33510107 by Jamie Madill Committed by Commit Bot

Pass gl::Context to more Buffer methods.

This will allow us to pull out the Renderer from the Context in more places in Buffer11, for state update. Impacts a few method calls in a few places. BUG=angleproject:2151 Change-Id: I1360caea65a94d3de4cd9f52d1b74b10439b02b3 Reviewed-on: https://chromium-review.googlesource.com/673136Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarFrank Henigman <fjhenigman@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 4cc89e2b
......@@ -192,7 +192,8 @@ void Buffer::onPixelUnpack()
mIndexRangeCache.clear();
}
Error Buffer::getIndexRange(GLenum type,
Error Buffer::getIndexRange(const gl::Context *context,
GLenum type,
size_t offset,
size_t count,
bool primitiveRestartEnabled,
......@@ -203,7 +204,8 @@ Error Buffer::getIndexRange(GLenum type,
return NoError();
}
ANGLE_TRY(mImpl->getIndexRange(type, offset, count, primitiveRestartEnabled, outRange));
ANGLE_TRY(
mImpl->getIndexRange(context, type, offset, count, primitiveRestartEnabled, outRange));
mIndexRangeCache.addRange(type, offset, count, primitiveRestartEnabled, *outRange);
......
......@@ -92,7 +92,8 @@ class Buffer final : public RefCountObject, public LabeledObject
void onTransformFeedback();
void onPixelUnpack();
Error getIndexRange(GLenum type,
Error getIndexRange(const gl::Context *context,
GLenum type,
size_t offset,
size_t count,
bool primitiveRestartEnabled,
......
......@@ -37,7 +37,7 @@ const Optional<IndexRange> &HasIndexRange::getIndexRange() const
uintptr_t offset = reinterpret_cast<uintptr_t>(mIndices);
IndexRange indexRange;
Error error =
elementArrayBuffer->getIndexRange(mType, static_cast<size_t>(offset), mCount,
elementArrayBuffer->getIndexRange(mContext, mType, static_cast<size_t>(offset), mCount,
state.isPrimitiveRestartEnabled(), &indexRange);
if (error.isError())
{
......
......@@ -53,7 +53,8 @@ class BufferImpl : angle::NonCopyable
void **mapPtr) = 0;
virtual gl::Error unmap(const gl::Context *context, GLboolean *result) = 0;
virtual gl::Error getIndexRange(GLenum type,
virtual gl::Error getIndexRange(const gl::Context *context,
GLenum type,
size_t offset,
size_t count,
bool primitiveRestartEnabled,
......
......@@ -32,7 +32,8 @@ class MockBufferImpl : public BufferImpl
gl::Error(const gl::Context *contextImpl, size_t, size_t, GLbitfield, void **));
MOCK_METHOD2(unmap, gl::Error(const gl::Context *contextImpl, GLboolean *result));
MOCK_METHOD5(getIndexRange, gl::Error(GLenum, size_t, size_t, bool, gl::IndexRange *));
MOCK_METHOD6(getIndexRange,
gl::Error(const gl::Context *, GLenum, size_t, size_t, bool, gl::IndexRange *));
MOCK_METHOD0(destructor, void());
......
......@@ -47,7 +47,7 @@ void BufferD3D::updateSerial()
mSerial = mNextSerial++;
}
void BufferD3D::updateD3DBufferUsage(GLenum usage)
void BufferD3D::updateD3DBufferUsage(const gl::Context *context, GLenum usage)
{
switch (usage)
{
......@@ -55,7 +55,7 @@ void BufferD3D::updateD3DBufferUsage(GLenum usage)
case GL_STATIC_READ:
case GL_STATIC_COPY:
mUsage = D3DBufferUsage::STATIC;
initializeStaticData();
initializeStaticData(context);
break;
case GL_STREAM_DRAW:
......@@ -71,7 +71,7 @@ void BufferD3D::updateD3DBufferUsage(GLenum usage)
}
}
void BufferD3D::initializeStaticData()
void BufferD3D::initializeStaticData(const gl::Context *context)
{
if (mStaticVertexBuffers.empty())
{
......@@ -140,7 +140,7 @@ StaticVertexBufferInterface *BufferD3D::getStaticVertexBuffer(const gl::VertexAt
return newStaticBuffer;
}
void BufferD3D::invalidateStaticData()
void BufferD3D::invalidateStaticData(const gl::Context *context)
{
emptyStaticBufferCache();
......@@ -153,14 +153,14 @@ void BufferD3D::invalidateStaticData()
// buffers so that they are populated the next time we use this buffer.
if (mUsage == D3DBufferUsage::STATIC)
{
initializeStaticData();
initializeStaticData(context);
}
mUnmodifiedDataUse = 0;
}
// Creates static buffers if sufficient used data has been left unmodified
void BufferD3D::promoteStaticUsage(int dataSize)
void BufferD3D::promoteStaticUsage(const gl::Context *context, int dataSize)
{
if (mUsage == D3DBufferUsage::DYNAMIC)
{
......@@ -168,19 +168,20 @@ void BufferD3D::promoteStaticUsage(int dataSize)
if (mUnmodifiedDataUse > 3 * getSize())
{
updateD3DBufferUsage(GL_STATIC_DRAW);
updateD3DBufferUsage(context, GL_STATIC_DRAW);
}
}
}
gl::Error BufferD3D::getIndexRange(GLenum type,
gl::Error BufferD3D::getIndexRange(const gl::Context *context,
GLenum type,
size_t offset,
size_t count,
bool primitiveRestartEnabled,
gl::IndexRange *outRange)
{
const uint8_t *data = nullptr;
ANGLE_TRY(getData(&data));
ANGLE_TRY(getData(context, &data));
*outRange = gl::ComputeIndexRange(type, data + offset, count, primitiveRestartEnabled);
return gl::NoError();
......
......@@ -43,8 +43,8 @@ class BufferD3D : public BufferImpl
virtual size_t getSize() const = 0;
virtual bool supportsDirectBinding() const = 0;
virtual gl::Error markTransformFeedbackUsage() = 0;
virtual gl::Error getData(const uint8_t **outData) = 0;
virtual gl::Error markTransformFeedbackUsage(const gl::Context *context) = 0;
virtual gl::Error getData(const gl::Context *context, const uint8_t **outData) = 0;
// Warning: you should ensure binding really matches attrib.bindingIndex before using this
// function.
......@@ -52,12 +52,13 @@ class BufferD3D : public BufferImpl
const gl::VertexBinding &binding);
StaticIndexBufferInterface *getStaticIndexBuffer();
virtual void initializeStaticData();
virtual void invalidateStaticData();
virtual void initializeStaticData(const gl::Context *context);
virtual void invalidateStaticData(const gl::Context *context);
void promoteStaticUsage(int dataSize);
void promoteStaticUsage(const gl::Context *context, int dataSize);
gl::Error getIndexRange(GLenum type,
gl::Error getIndexRange(const gl::Context *context,
GLenum type,
size_t offset,
size_t count,
bool primitiveRestartEnabled,
......@@ -68,7 +69,7 @@ class BufferD3D : public BufferImpl
protected:
void updateSerial();
void updateD3DBufferUsage(GLenum usage);
void updateD3DBufferUsage(const gl::Context *context, GLenum usage);
void emptyStaticBufferCache();
BufferFactoryD3D *mFactory;
......
......@@ -204,7 +204,8 @@ bool IndexDataManager::IsStreamingIndexData(const gl::Context *context,
// When we have a buffer with an unsupported format (subcase b) then we need to do some translation:
// we will start by falling back to streaming, and after a while will start using a static
// translated copy of the index buffer.
gl::Error IndexDataManager::prepareIndexData(GLenum srcType,
gl::Error IndexDataManager::prepareIndexData(const gl::Context *context,
GLenum srcType,
GLsizei count,
gl::Buffer *glBuffer,
const void *indices,
......@@ -293,14 +294,14 @@ gl::Error IndexDataManager::prepareIndexData(GLenum srcType,
if (staticBufferInitialized && !staticBufferUsable)
{
buffer->invalidateStaticData();
buffer->invalidateStaticData(context);
staticBuffer = nullptr;
}
if (staticBuffer == nullptr || !offsetAligned)
{
const uint8_t *bufferData = nullptr;
gl::Error error = buffer->getData(&bufferData);
gl::Error error = buffer->getData(context, &bufferData);
if (error.isError())
{
return error;
......@@ -313,14 +314,14 @@ gl::Error IndexDataManager::prepareIndexData(GLenum srcType,
{
return error;
}
buffer->promoteStaticUsage(count << srcTypeInfo.bytesShift);
buffer->promoteStaticUsage(context, count << srcTypeInfo.bytesShift);
}
else
{
if (!staticBufferInitialized)
{
const uint8_t *bufferData = nullptr;
gl::Error error = buffer->getData(&bufferData);
gl::Error error = buffer->getData(context, &bufferData);
if (error.isError())
{
return error;
......
......@@ -76,7 +76,8 @@ class IndexDataManager : angle::NonCopyable
static bool IsStreamingIndexData(const gl::Context *context,
GLenum srcType,
RendererClass rendererClass);
gl::Error prepareIndexData(GLenum srcType,
gl::Error prepareIndexData(const gl::Context *context,
GLenum srcType,
GLsizei count,
gl::Buffer *glBuffer,
const void *indices,
......
......@@ -33,8 +33,11 @@ namespace rx
namespace
{
gl::Error GetUnpackPointer(const gl::PixelUnpackState &unpack, const uint8_t *pixels,
ptrdiff_t layerOffset, const uint8_t **pointerOut)
gl::Error GetUnpackPointer(const gl::Context *context,
const gl::PixelUnpackState &unpack,
const uint8_t *pixels,
ptrdiff_t layerOffset,
const uint8_t **pointerOut)
{
if (unpack.pixelBuffer.id() != 0)
{
......@@ -47,7 +50,7 @@ gl::Error GetUnpackPointer(const gl::PixelUnpackState &unpack, const uint8_t *pi
BufferD3D *bufferD3D = GetImplAs<BufferD3D>(pixelBuffer);
ASSERT(bufferD3D);
const uint8_t *bufferData = nullptr;
ANGLE_TRY(bufferD3D->getData(&bufferData));
ANGLE_TRY(bufferD3D->getData(context, &bufferData));
*pointerOut = bufferData + offset;
}
else
......@@ -229,7 +232,7 @@ gl::Error TextureD3D::setImageImpl(const gl::Context *context,
// We no longer need the "GLenum format" parameter to TexImage to determine what data format "pixels" contains.
// From our image internal format we know how many channels to expect, and "type" gives the format of pixel's components.
const uint8_t *pixelData = nullptr;
ANGLE_TRY(GetUnpackPointer(unpack, pixels, layerOffset, &pixelData));
ANGLE_TRY(GetUnpackPointer(context, unpack, pixels, layerOffset, &pixelData));
if (pixelData != nullptr)
{
......@@ -262,7 +265,7 @@ gl::Error TextureD3D::subImage(const gl::Context *context,
{
// CPU readback & copy where direct GPU copy is not supported
const uint8_t *pixelData = nullptr;
ANGLE_TRY(GetUnpackPointer(unpack, pixels, layerOffset, &pixelData));
ANGLE_TRY(GetUnpackPointer(context, unpack, pixels, layerOffset, &pixelData));
if (pixelData != nullptr)
{
......@@ -299,7 +302,7 @@ gl::Error TextureD3D::setCompressedImageImpl(const gl::Context *context,
// We no longer need the "GLenum format" parameter to TexImage to determine what data format "pixels" contains.
// From our image internal format we know how many channels to expect, and "type" gives the format of pixel's components.
const uint8_t *pixelData = nullptr;
ANGLE_TRY(GetUnpackPointer(unpack, pixels, layerOffset, &pixelData));
ANGLE_TRY(GetUnpackPointer(context, unpack, pixels, layerOffset, &pixelData));
if (pixelData != nullptr)
{
......@@ -321,7 +324,7 @@ gl::Error TextureD3D::subImageCompressed(const gl::Context *context,
ptrdiff_t layerOffset)
{
const uint8_t *pixelData = nullptr;
ANGLE_TRY(GetUnpackPointer(unpack, pixels, layerOffset, &pixelData));
ANGLE_TRY(GetUnpackPointer(context, unpack, pixels, layerOffset, &pixelData));
if (pixelData != nullptr)
{
......
......@@ -11,11 +11,12 @@
#include "common/bitset_utils.h"
#include "libANGLE/Buffer.h"
#include "libANGLE/formatutils.h"
#include "libANGLE/Context.h"
#include "libANGLE/Program.h"
#include "libANGLE/State.h"
#include "libANGLE/VertexAttribute.h"
#include "libANGLE/VertexArray.h"
#include "libANGLE/VertexAttribute.h"
#include "libANGLE/formatutils.h"
#include "libANGLE/renderer/d3d/BufferD3D.h"
#include "libANGLE/renderer/d3d/RendererD3D.h"
#include "libANGLE/renderer/d3d/VertexBuffer.h"
......@@ -217,7 +218,7 @@ void VertexDataManager::deinitialize()
mCurrentValueCache.clear();
}
gl::Error VertexDataManager::prepareVertexData(const gl::State &state,
gl::Error VertexDataManager::prepareVertexData(const gl::Context *context,
GLint start,
GLsizei count,
std::vector<TranslatedAttribute> *translatedAttribs,
......@@ -225,6 +226,7 @@ gl::Error VertexDataManager::prepareVertexData(const gl::State &state,
{
ASSERT(mStreamingBuffer);
const gl::State &state = context->getGLState();
const gl::VertexArray *vertexArray = state.getVertexArray();
const auto &vertexAttributes = vertexArray->getVertexAttributes();
const auto &vertexBindings = vertexArray->getVertexBindings();
......@@ -261,7 +263,7 @@ gl::Error VertexDataManager::prepareVertexData(const gl::State &state,
case VertexStorageType::STATIC:
{
// Store static attribute.
ANGLE_TRY(StoreStaticAttrib(translated));
ANGLE_TRY(StoreStaticAttrib(context, translated));
break;
}
case VertexStorageType::DYNAMIC:
......@@ -288,10 +290,10 @@ gl::Error VertexDataManager::prepareVertexData(const gl::State &state,
return gl::NoError();
}
ANGLE_TRY(
storeDynamicAttribs(translatedAttribs, mDynamicAttribsMaskCache, start, count, instances));
ANGLE_TRY(storeDynamicAttribs(context, translatedAttribs, mDynamicAttribsMaskCache, start,
count, instances));
PromoteDynamicAttribs(*translatedAttribs, mDynamicAttribsMaskCache, count);
PromoteDynamicAttribs(context, *translatedAttribs, mDynamicAttribsMaskCache, count);
return gl::NoError();
}
......@@ -320,7 +322,8 @@ void VertexDataManager::StoreDirectAttrib(TranslatedAttribute *directAttrib)
}
// static
gl::Error VertexDataManager::StoreStaticAttrib(TranslatedAttribute *translated)
gl::Error VertexDataManager::StoreStaticAttrib(const gl::Context *context,
TranslatedAttribute *translated)
{
ASSERT(translated->attribute && translated->binding);
const auto &attrib = *translated->attribute;
......@@ -334,7 +337,7 @@ gl::Error VertexDataManager::StoreStaticAttrib(TranslatedAttribute *translated)
const uint8_t *sourceData = nullptr;
const int offset = static_cast<int>(ComputeVertexAttributeOffset(attrib, binding));
ANGLE_TRY(bufferD3D->getData(&sourceData));
ANGLE_TRY(bufferD3D->getData(context, &sourceData));
sourceData += offset;
unsigned int streamOffset = 0;
......@@ -383,6 +386,7 @@ gl::Error VertexDataManager::StoreStaticAttrib(TranslatedAttribute *translated)
}
gl::Error VertexDataManager::storeDynamicAttribs(
const gl::Context *context,
std::vector<TranslatedAttribute> *translatedAttribs,
const gl::AttributesMask &dynamicAttribsMask,
GLint start,
......@@ -418,13 +422,14 @@ gl::Error VertexDataManager::storeDynamicAttribs(
for (auto attribIndex : dynamicAttribsMask)
{
auto *dynamicAttrib = &(*translatedAttribs)[attribIndex];
ANGLE_TRY(storeDynamicAttrib(dynamicAttrib, start, count, instances));
ANGLE_TRY(storeDynamicAttrib(context, dynamicAttrib, start, count, instances));
}
return gl::NoError();
}
void VertexDataManager::PromoteDynamicAttribs(
const gl::Context *context,
const std::vector<TranslatedAttribute> &translatedAttribs,
const gl::AttributesMask &dynamicAttribsMask,
GLsizei count)
......@@ -440,7 +445,7 @@ void VertexDataManager::PromoteDynamicAttribs(
{
BufferD3D *bufferD3D = GetImplAs<BufferD3D>(buffer);
size_t typeSize = ComputeVertexAttributeTypeSize(*dynamicAttrib.attribute);
bufferD3D->promoteStaticUsage(count * static_cast<int>(typeSize));
bufferD3D->promoteStaticUsage(context, count * static_cast<int>(typeSize));
}
}
}
......@@ -483,7 +488,8 @@ gl::Error VertexDataManager::reserveSpaceForAttrib(const TranslatedAttribute &tr
instances);
}
gl::Error VertexDataManager::storeDynamicAttrib(TranslatedAttribute *translated,
gl::Error VertexDataManager::storeDynamicAttrib(const gl::Context *context,
TranslatedAttribute *translated,
GLint start,
GLsizei count,
GLsizei instances)
......@@ -506,7 +512,7 @@ gl::Error VertexDataManager::storeDynamicAttrib(TranslatedAttribute *translated,
if (buffer)
{
ANGLE_TRY(storage->getData(&sourceData));
ANGLE_TRY(storage->getData(context, &sourceData));
sourceData += static_cast<int>(ComputeVertexAttributeOffset(attrib, binding));
}
else
......
......@@ -90,7 +90,7 @@ class VertexDataManager : angle::NonCopyable
gl::Error initialize();
void deinitialize();
gl::Error prepareVertexData(const gl::State &state,
gl::Error prepareVertexData(const gl::Context *context,
GLint start,
GLsizei count,
std::vector<TranslatedAttribute> *translatedAttribs,
......@@ -98,16 +98,18 @@ class VertexDataManager : angle::NonCopyable
static void StoreDirectAttrib(TranslatedAttribute *directAttrib);
static gl::Error StoreStaticAttrib(TranslatedAttribute *translated);
static gl::Error StoreStaticAttrib(const gl::Context *context, TranslatedAttribute *translated);
gl::Error storeDynamicAttribs(std::vector<TranslatedAttribute> *translatedAttribs,
gl::Error storeDynamicAttribs(const gl::Context *context,
std::vector<TranslatedAttribute> *translatedAttribs,
const gl::AttributesMask &dynamicAttribsMask,
GLint start,
GLsizei count,
GLsizei instances);
// Promote static usage of dynamic buffers.
static void PromoteDynamicAttribs(const std::vector<TranslatedAttribute> &translatedAttribs,
static void PromoteDynamicAttribs(const gl::Context *context,
const std::vector<TranslatedAttribute> &translatedAttribs,
const gl::AttributesMask &dynamicAttribsMask,
GLsizei count);
......@@ -131,7 +133,8 @@ class VertexDataManager : angle::NonCopyable
GLint start,
GLsizei instances) const;
gl::Error storeDynamicAttrib(TranslatedAttribute *translated,
gl::Error storeDynamicAttrib(const gl::Context *context,
TranslatedAttribute *translated,
GLint start,
GLsizei count,
GLsizei instances);
......
......@@ -53,16 +53,19 @@ class Buffer11 : public BufferD3D
Buffer11(const gl::BufferState &state, Renderer11 *renderer);
virtual ~Buffer11();
gl::ErrorOrResult<ID3D11Buffer *> getBuffer(BufferUsage usage);
gl::ErrorOrResult<ID3D11Buffer *> getEmulatedIndexedBuffer(SourceIndexData *indexInfo,
gl::ErrorOrResult<ID3D11Buffer *> getBuffer(const gl::Context *context, BufferUsage usage);
gl::ErrorOrResult<ID3D11Buffer *> getEmulatedIndexedBuffer(const gl::Context *context,
SourceIndexData *indexInfo,
const TranslatedAttribute &attribute,
GLint startVertex);
gl::Error getConstantBufferRange(GLintptr offset,
gl::Error getConstantBufferRange(const gl::Context *context,
GLintptr offset,
GLsizeiptr size,
const d3d11::Buffer **bufferOut,
UINT *firstConstantOut,
UINT *numConstantsOut);
gl::ErrorOrResult<const d3d11::ShaderResourceView *> getSRV(DXGI_FORMAT srvFormat);
gl::ErrorOrResult<const d3d11::ShaderResourceView *> getSRV(const gl::Context *context,
DXGI_FORMAT srvFormat);
bool isMapped() const { return mMappedStorage != nullptr; }
gl::Error packPixels(const gl::Context *context,
const gl::FramebufferAttachment &readAttachment,
......@@ -72,9 +75,9 @@ class Buffer11 : public BufferD3D
// BufferD3D implementation
size_t getSize() const override { return mSize; }
bool supportsDirectBinding() const override;
gl::Error getData(const uint8_t **outData) override;
void initializeStaticData() override;
void invalidateStaticData() override;
gl::Error getData(const gl::Context *context, const uint8_t **outData) override;
void initializeStaticData(const gl::Context *context) override;
void invalidateStaticData(const gl::Context *context) override;
// BufferImpl implementation
gl::Error setData(const gl::Context *context,
......@@ -99,7 +102,7 @@ class Buffer11 : public BufferD3D
GLbitfield access,
void **mapPtr) override;
gl::Error unmap(const gl::Context *context, GLboolean *result) override;
gl::Error markTransformFeedbackUsage() override;
gl::Error markTransformFeedbackUsage(const gl::Context *context) override;
// We use two set of dirty events. Static buffers are marked dirty whenever
// data changes, because they must be re-translated. Direct buffers only need to be
......@@ -123,23 +126,28 @@ class Buffer11 : public BufferD3D
};
void markBufferUsage(BufferUsage usage);
gl::Error garbageCollection(BufferUsage currentUsage);
gl::ErrorOrResult<NativeStorage *> getStagingStorage();
gl::ErrorOrResult<PackStorage *> getPackStorage();
gl::ErrorOrResult<SystemMemoryStorage *> getSystemMemoryStorage();
gl::Error updateBufferStorage(BufferStorage *storage, size_t sourceOffset, size_t storageSize);
gl::ErrorOrResult<BufferStorage *> getBufferStorage(BufferUsage usage);
gl::ErrorOrResult<BufferStorage *> getLatestBufferStorage() const;
gl::ErrorOrResult<BufferStorage *> getConstantBufferRangeStorage(GLintptr offset,
gl::Error garbageCollection(const gl::Context *context, BufferUsage currentUsage);
gl::ErrorOrResult<NativeStorage *> getStagingStorage(const gl::Context *context);
gl::ErrorOrResult<PackStorage *> getPackStorage(const gl::Context *context);
gl::ErrorOrResult<SystemMemoryStorage *> getSystemMemoryStorage(const gl::Context *context);
gl::Error updateBufferStorage(const gl::Context *context,
BufferStorage *storage,
size_t sourceOffset,
size_t storageSize);
gl::ErrorOrResult<BufferStorage *> getBufferStorage(const gl::Context *context,
BufferUsage usage);
gl::ErrorOrResult<BufferStorage *> getLatestBufferStorage(const gl::Context *context) const;
gl::ErrorOrResult<BufferStorage *> getConstantBufferRangeStorage(const gl::Context *context,
GLintptr offset,
GLsizeiptr size);
BufferStorage *allocateStorage(BufferUsage usage);
void updateDeallocThreshold(BufferUsage usage);
// Free the storage if we decide it isn't being used very often.
gl::Error checkForDeallocation(BufferUsage usage);
gl::Error checkForDeallocation(const gl::Context *context, BufferUsage usage);
// For some cases of uniform buffer storage, we can't deallocate system memory storage.
bool canDeallocateSystemMemory() const;
......
......@@ -12,6 +12,7 @@
#include "common/bitset_utils.h"
#include "common/third_party/murmurhash/MurmurHash3.h"
#include "common/utilities.h"
#include "libANGLE/Context.h"
#include "libANGLE/Program.h"
#include "libANGLE/VertexArray.h"
#include "libANGLE/VertexAttribute.h"
......@@ -19,6 +20,7 @@
#include "libANGLE/renderer/d3d/ProgramD3D.h"
#include "libANGLE/renderer/d3d/VertexDataManager.h"
#include "libANGLE/renderer/d3d/d3d11/Buffer11.h"
#include "libANGLE/renderer/d3d/d3d11/Context11.h"
#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
#include "libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h"
#include "libANGLE/renderer/d3d/d3d11/VertexBuffer11.h"
......@@ -119,13 +121,14 @@ void InputLayoutCache::clear()
}
gl::Error InputLayoutCache::applyVertexBuffers(
Renderer11 *renderer,
const gl::State &state,
const gl::Context *context,
const std::vector<const TranslatedAttribute *> &currentAttributes,
GLenum mode,
GLint start,
TranslatedIndexData *indexInfo)
{
Renderer11 *renderer = GetImplAs<Context11>(context)->getRenderer();
const gl::State &state = context->getGLState();
auto *stateManager = renderer->getStateManager();
gl::Program *program = state.getProgram();
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
......@@ -162,7 +165,7 @@ gl::Error InputLayoutCache::applyVertexBuffers(
if (indexInfo->srcIndexData.srcBuffer != nullptr)
{
const uint8_t *bufferData = nullptr;
ANGLE_TRY(indexInfo->srcIndexData.srcBuffer->getData(&bufferData));
ANGLE_TRY(indexInfo->srcIndexData.srcBuffer->getData(context, &bufferData));
ASSERT(bufferData != nullptr);
ptrdiff_t offset =
......@@ -171,14 +174,15 @@ gl::Error InputLayoutCache::applyVertexBuffers(
indexInfo->srcIndexData.srcIndices = bufferData + offset;
}
ANGLE_TRY_RESULT(bufferStorage->getEmulatedIndexedBuffer(&indexInfo->srcIndexData,
attrib, start),
ANGLE_TRY_RESULT(bufferStorage->getEmulatedIndexedBuffer(
context, &indexInfo->srcIndexData, attrib, start),
buffer);
}
else
{
ANGLE_TRY_RESULT(
bufferStorage->getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK), buffer);
bufferStorage->getBuffer(context, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK),
buffer);
}
vertexStride = attrib.stride;
......
......@@ -85,8 +85,7 @@ class InputLayoutCache : angle::NonCopyable
void clear();
gl::Error applyVertexBuffers(Renderer11 *renderer,
const gl::State &state,
gl::Error applyVertexBuffers(const gl::Context *context,
const std::vector<const TranslatedAttribute *> &currentAttributes,
GLenum mode,
GLint start,
......
......@@ -172,7 +172,7 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::Context *context,
ASSERT(srvFormat != DXGI_FORMAT_UNKNOWN);
Buffer11 *bufferStorage11 = GetAs<Buffer11>(sourceBuffer.getImplementation());
const d3d11::ShaderResourceView *bufferSRV = nullptr;
ANGLE_TRY_RESULT(bufferStorage11->getSRV(srvFormat), bufferSRV);
ANGLE_TRY_RESULT(bufferStorage11->getSRV(context, srvFormat), bufferSRV);
ASSERT(bufferSRV != nullptr);
const d3d11::RenderTargetView &textureRTV =
......
......@@ -1511,12 +1511,12 @@ gl::Error Renderer11::drawArraysImpl(const gl::Context *context,
if (mode == GL_LINE_LOOP)
{
return drawLineLoop(glState, count, GL_NONE, nullptr, 0, adjustedInstanceCount);
return drawLineLoop(context, count, GL_NONE, nullptr, 0, adjustedInstanceCount);
}
if (mode == GL_TRIANGLE_FAN)
{
return drawTriangleFan(glState, count, GL_NONE, nullptr, 0, adjustedInstanceCount);
return drawTriangleFan(context, count, GL_NONE, nullptr, 0, adjustedInstanceCount);
}
bool useInstancedPointSpriteEmulation =
......@@ -1609,12 +1609,12 @@ gl::Error Renderer11::drawElementsImpl(const gl::Context *context,
if (mode == GL_LINE_LOOP)
{
return drawLineLoop(glState, count, type, indices, baseVertex, adjustedInstanceCount);
return drawLineLoop(context, count, type, indices, baseVertex, adjustedInstanceCount);
}
if (mode == GL_TRIANGLE_FAN)
{
return drawTriangleFan(glState, count, type, indices, baseVertex, adjustedInstanceCount);
return drawTriangleFan(context, count, type, indices, baseVertex, adjustedInstanceCount);
}
const ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
......@@ -1686,13 +1686,13 @@ gl::Error Renderer11::drawArraysIndirectImpl(const gl::Context *context,
{
ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, 0, 0, 0, nullptr));
ID3D11Buffer *buffer = nullptr;
ANGLE_TRY_RESULT(storage->getBuffer(BUFFER_USAGE_INDIRECT), buffer);
ANGLE_TRY_RESULT(storage->getBuffer(context, BUFFER_USAGE_INDIRECT), buffer);
mDeviceContext->DrawInstancedIndirect(buffer, static_cast<unsigned int>(offset));
return gl::NoError();
}
const uint8_t *bufferData = nullptr;
ANGLE_TRY(storage->getData(&bufferData));
ANGLE_TRY(storage->getData(context, &bufferData));
ASSERT(bufferData);
const gl::DrawArraysIndirectCommand *args =
reinterpret_cast<const gl::DrawArraysIndirectCommand *>(bufferData + offset);
......@@ -1704,11 +1704,11 @@ gl::Error Renderer11::drawArraysIndirectImpl(const gl::Context *context,
if (mode == GL_LINE_LOOP)
{
return drawLineLoop(glState, count, GL_NONE, nullptr, 0, instances);
return drawLineLoop(context, count, GL_NONE, nullptr, 0, instances);
}
if (mode == GL_TRIANGLE_FAN)
{
return drawTriangleFan(glState, count, GL_NONE, nullptr, 0, instances);
return drawTriangleFan(context, count, GL_NONE, nullptr, 0, instances);
}
mDeviceContext->DrawInstanced(count, instances, 0, 0);
......@@ -1737,13 +1737,13 @@ gl::Error Renderer11::drawElementsIndirectImpl(const gl::Context *context,
ANGLE_TRY(mStateManager.applyIndexBuffer(context, nullptr, 0, type, &indexInfo));
ANGLE_TRY(mStateManager.applyVertexBuffer(context, mode, 0, 0, 0, &indexInfo));
ID3D11Buffer *buffer = nullptr;
ANGLE_TRY_RESULT(storage->getBuffer(BUFFER_USAGE_INDIRECT), buffer);
ANGLE_TRY_RESULT(storage->getBuffer(context, BUFFER_USAGE_INDIRECT), buffer);
mDeviceContext->DrawIndexedInstancedIndirect(buffer, static_cast<unsigned int>(offset));
return gl::NoError();
}
const uint8_t *bufferData = nullptr;
ANGLE_TRY(storage->getData(&bufferData));
ANGLE_TRY(storage->getData(context, &bufferData));
ASSERT(bufferData);
const gl::DrawElementsIndirectCommand *cmd =
......@@ -1759,8 +1759,9 @@ gl::Error Renderer11::drawElementsIndirectImpl(const gl::Context *context,
gl::Buffer *elementArrayBuffer = glState.getVertexArray()->getElementArrayBuffer().get();
ASSERT(elementArrayBuffer);
gl::IndexRange indexRange;
ANGLE_TRY(elementArrayBuffer->getIndexRange(type, reinterpret_cast<size_t>(indices), count,
glState.isPrimitiveRestartEnabled(), &indexRange));
ANGLE_TRY(elementArrayBuffer->getIndexRange(context, type, reinterpret_cast<size_t>(indices),
count, glState.isPrimitiveRestartEnabled(),
&indexRange));
indexInfo.indexRange = indexRange;
ANGLE_TRY(mStateManager.applyIndexBuffer(context, indices, count, type, &indexInfo));
......@@ -1772,25 +1773,26 @@ gl::Error Renderer11::drawElementsIndirectImpl(const gl::Context *context,
int baseVertexLocation = -static_cast<int>(indexRange.start);
if (mode == GL_LINE_LOOP)
{
return drawLineLoop(glState, count, type, indices, baseVertexLocation, instances);
return drawLineLoop(context, count, type, indices, baseVertexLocation, instances);
}
if (mode == GL_TRIANGLE_FAN)
{
return drawTriangleFan(glState, count, type, indices, baseVertexLocation, instances);
return drawTriangleFan(context, count, type, indices, baseVertexLocation, instances);
}
mDeviceContext->DrawIndexedInstanced(count, instances, 0, baseVertexLocation, 0);
return gl::NoError();
}
gl::Error Renderer11::drawLineLoop(const gl::State &glState,
gl::Error Renderer11::drawLineLoop(const gl::Context *context,
GLsizei count,
GLenum type,
const void *indexPointer,
int baseVertex,
int instances)
{
const gl::State &glState = context->getGLState();
gl::VertexArray *vao = glState.getVertexArray();
gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
......@@ -1803,7 +1805,7 @@ gl::Error Renderer11::drawLineLoop(const gl::State &glState,
intptr_t offset = reinterpret_cast<intptr_t>(indices);
const uint8_t *bufferData = nullptr;
ANGLE_TRY(storage->getData(&bufferData));
ANGLE_TRY(storage->getData(context, &bufferData));
indices = bufferData + offset;
}
......@@ -1867,13 +1869,14 @@ gl::Error Renderer11::drawLineLoop(const gl::State &glState,
return gl::NoError();
}
gl::Error Renderer11::drawTriangleFan(const gl::State &glState,
gl::Error Renderer11::drawTriangleFan(const gl::Context *context,
GLsizei count,
GLenum type,
const void *indices,
int baseVertex,
int instances)
{
const gl::State &glState = context->getGLState();
gl::VertexArray *vao = glState.getVertexArray();
gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
......@@ -1886,7 +1889,7 @@ gl::Error Renderer11::drawTriangleFan(const gl::State &glState,
intptr_t offset = reinterpret_cast<intptr_t>(indices);
const uint8_t *bufferData = nullptr;
ANGLE_TRY(storage->getData(&bufferData));
ANGLE_TRY(storage->getData(context, &bufferData));
indexPointer = bufferData + offset;
}
......@@ -3839,7 +3842,7 @@ gl::Error Renderer11::genericDrawArrays(const gl::Context *context,
if (glState.isTransformFeedbackActiveUnpaused())
{
ANGLE_TRY(markTransformFeedbackUsage(glState));
ANGLE_TRY(markTransformFeedbackUsage(context));
}
}
......@@ -4040,8 +4043,9 @@ bool Renderer11::canSelectViewInVertexShader() const
getRenderer11DeviceCaps().supportsVpRtIndexWriteFromVertexShader;
}
gl::Error Renderer11::markTransformFeedbackUsage(const gl::State &glState)
gl::Error Renderer11::markTransformFeedbackUsage(const gl::Context *context)
{
const gl::State &glState = context->getGLState();
const gl::TransformFeedback *transformFeedback = glState.getCurrentTransformFeedback();
for (size_t i = 0; i < transformFeedback->getIndexedBufferCount(); i++)
{
......@@ -4050,7 +4054,7 @@ gl::Error Renderer11::markTransformFeedbackUsage(const gl::State &glState)
if (binding.get() != nullptr)
{
BufferD3D *bufferD3D = GetImplAs<BufferD3D>(binding.get());
ANGLE_TRY(bufferD3D->markTransformFeedbackUsage());
ANGLE_TRY(bufferD3D->markTransformFeedbackUsage(context));
}
}
......
......@@ -484,13 +484,13 @@ class Renderer11 : public RendererD3D
angle::WorkaroundsD3D generateWorkarounds() const override;
gl::Error drawLineLoop(const gl::State &glState,
gl::Error drawLineLoop(const gl::Context *context,
GLsizei count,
GLenum type,
const void *indices,
int baseVertex,
int instances);
gl::Error drawTriangleFan(const gl::State &glState,
gl::Error drawTriangleFan(const gl::Context *context,
GLsizei count,
GLenum type,
const void *indices,
......@@ -524,7 +524,7 @@ class Renderer11 : public RendererD3D
d3d11::ANGLED3D11DeviceType getDeviceType() const;
gl::Error markTransformFeedbackUsage(const gl::State &glState);
gl::Error markTransformFeedbackUsage(const gl::Context *context);
HMODULE mD3d11Module;
HMODULE mDxgiModule;
......
......@@ -2486,8 +2486,8 @@ gl::Error StateManager11::applyVertexBuffer(const gl::Context *context,
sortedSemanticIndices, numIndicesPerInstance));
// Update the applied vertex buffers.
ANGLE_TRY(mInputLayoutCache.applyVertexBuffers(mRenderer, state, mCurrentAttributes, mode,
first, indexInfo));
ANGLE_TRY(
mInputLayoutCache.applyVertexBuffers(context, mCurrentAttributes, mode, first, indexInfo));
// InputLayoutCache::applyVertexBuffers calls through to the Bufer11 to get the native vertex
// buffer (ID3D11Buffer *). Because we allocate these buffers lazily, this will trigger
......@@ -2496,7 +2496,7 @@ gl::Error StateManager11::applyVertexBuffer(const gl::Context *context,
// update on the second draw call.
// Hence we clear the flags here, after we've applied vertex data, since we know everything
// is clean. This is a bit of a hack.
vertexArray11->clearDirtyAndPromoteDynamicAttribs(state, count);
vertexArray11->clearDirtyAndPromoteDynamicAttribs(context, count);
mInputLayoutIsDirty = false;
return gl::NoError();
......@@ -2511,7 +2511,7 @@ gl::Error StateManager11::applyIndexBuffer(const gl::Context *context,
const auto &glState = context->getGLState();
gl::VertexArray *vao = glState.getVertexArray();
gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
ANGLE_TRY(mIndexDataManager.prepareIndexData(type, count, elementArrayBuffer, indices,
ANGLE_TRY(mIndexDataManager.prepareIndexData(context, type, count, elementArrayBuffer, indices,
indexInfo, glState.isPrimitiveRestartEnabled()));
ID3D11Buffer *buffer = nullptr;
......@@ -2521,7 +2521,7 @@ gl::Error StateManager11::applyIndexBuffer(const gl::Context *context,
if (indexInfo->storage)
{
Buffer11 *storage = GetAs<Buffer11>(indexInfo->storage);
ANGLE_TRY_RESULT(storage->getBuffer(BUFFER_USAGE_INDEX), buffer);
ANGLE_TRY_RESULT(storage->getBuffer(context, BUFFER_USAGE_INDEX), buffer);
}
else
{
......@@ -2799,9 +2799,9 @@ gl::Error StateManager11::syncUniformBuffers(const gl::Context *context, Program
UINT firstConstant = 0;
UINT numConstants = 0;
ANGLE_TRY(bufferStorage->getConstantBufferRange(uniformBufferOffset, uniformBufferSize,
&constantBuffer, &firstConstant,
&numConstants));
ANGLE_TRY(bufferStorage->getConstantBufferRange(context, uniformBufferOffset,
uniformBufferSize, &constantBuffer,
&firstConstant, &numConstants));
ASSERT(constantBuffer);
......@@ -2853,9 +2853,9 @@ gl::Error StateManager11::syncUniformBuffers(const gl::Context *context, Program
UINT firstConstant = 0;
UINT numConstants = 0;
ANGLE_TRY(bufferStorage->getConstantBufferRange(uniformBufferOffset, uniformBufferSize,
&constantBuffer, &firstConstant,
&numConstants));
ANGLE_TRY(bufferStorage->getConstantBufferRange(context, uniformBufferOffset,
uniformBufferSize, &constantBuffer,
&firstConstant, &numConstants));
ASSERT(constantBuffer);
......@@ -2911,7 +2911,7 @@ gl::Error StateManager11::syncTransformFeedbackBuffers(const gl::Context *contex
}
const std::vector<ID3D11Buffer *> *soBuffers = nullptr;
ANGLE_TRY_RESULT(tf11->getSOBuffers(), soBuffers);
ANGLE_TRY_RESULT(tf11->getSOBuffers(context), soBuffers);
const std::vector<UINT> &soOffsets = tf11->getSOBufferOffsets();
deviceContext->SOSetTargets(tf11->getNumSOBuffers(), soBuffers->data(), soOffsets.data());
......
......@@ -94,7 +94,8 @@ UINT TransformFeedback11::getNumSOBuffers() const
return static_cast<UINT>(mBuffers.size());
}
gl::ErrorOrResult<const std::vector<ID3D11Buffer *> *> TransformFeedback11::getSOBuffers()
gl::ErrorOrResult<const std::vector<ID3D11Buffer *> *> TransformFeedback11::getSOBuffers(
const gl::Context *context)
{
for (size_t bindingIdx = 0; bindingIdx < mBuffers.size(); bindingIdx++)
{
......@@ -102,7 +103,7 @@ gl::ErrorOrResult<const std::vector<ID3D11Buffer *> *> TransformFeedback11::getS
if (binding.get() != nullptr)
{
Buffer11 *storage = GetImplAs<Buffer11>(binding.get());
ANGLE_TRY_RESULT(storage->getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK),
ANGLE_TRY_RESULT(storage->getBuffer(context, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK),
mBuffers[bindingIdx]);
}
}
......
......@@ -41,7 +41,7 @@ class TransformFeedback11 : public TransformFeedbackImpl
bool isDirty() const;
UINT getNumSOBuffers() const;
gl::ErrorOrResult<const std::vector<ID3D11Buffer *> *> getSOBuffers();
gl::ErrorOrResult<const std::vector<ID3D11Buffer *> *> getSOBuffers(const gl::Context *context);
const std::vector<UINT> &getSOBufferOffsets() const;
Serial getSerial() const;
......
......@@ -210,7 +210,7 @@ gl::Error VertexArray11::updateDirtyAndDynamicAttribs(const gl::Context *context
break;
case VertexStorageType::STATIC:
{
ANGLE_TRY(VertexDataManager::StoreStaticAttrib(translatedAttrib));
ANGLE_TRY(VertexDataManager::StoreStaticAttrib(context, translatedAttrib));
break;
}
case VertexStorageType::CURRENT_VALUE:
......@@ -240,8 +240,8 @@ gl::Error VertexArray11::updateDirtyAndDynamicAttribs(const gl::Context *context
dynamicAttrib->binding->getDivisor() * mAppliedNumViewsToDivisor;
}
ANGLE_TRY(vertexDataManager->storeDynamicAttribs(&mTranslatedAttribs, activeDynamicAttribs,
start, count, instances));
ANGLE_TRY(vertexDataManager->storeDynamicAttribs(
context, &mTranslatedAttribs, activeDynamicAttribs, start, count, instances));
}
return gl::NoError();
......@@ -252,7 +252,7 @@ const std::vector<TranslatedAttribute> &VertexArray11::getTranslatedAttribs() co
return mTranslatedAttribs;
}
void VertexArray11::signal(size_t channelID)
void VertexArray11::signal(size_t channelID, const gl::Context *context)
{
ASSERT(mAttributeStorageTypes[channelID] != VertexStorageType::CURRENT_VALUE);
......@@ -260,15 +260,17 @@ void VertexArray11::signal(size_t channelID)
mAttribsToUpdate.set(channelID);
}
void VertexArray11::clearDirtyAndPromoteDynamicAttribs(const gl::State &state, GLsizei count)
void VertexArray11::clearDirtyAndPromoteDynamicAttribs(const gl::Context *context, GLsizei count)
{
const gl::State &state = context->getGLState();
const gl::Program *program = state.getProgram();
const auto &activeLocations = program->getActiveAttribLocationsMask();
mAttribsToUpdate &= ~activeLocations;
// Promote to static after we clear the dirty attributes, otherwise we can lose dirtyness.
auto activeDynamicAttribs = (mDynamicAttribsMask & activeLocations);
VertexDataManager::PromoteDynamicAttribs(mTranslatedAttribs, activeDynamicAttribs, count);
VertexDataManager::PromoteDynamicAttribs(context, mTranslatedAttribs, activeDynamicAttribs,
count);
}
void VertexArray11::markAllAttributeDivisorsForAdjustment(int numViews)
......
......@@ -34,12 +34,12 @@ class VertexArray11 : public VertexArrayImpl, public OnBufferDataDirtyReceiver
GLint start,
GLsizei count,
GLsizei instances);
void clearDirtyAndPromoteDynamicAttribs(const gl::State &state, GLsizei count);
void clearDirtyAndPromoteDynamicAttribs(const gl::Context *context, GLsizei count);
const std::vector<TranslatedAttribute> &getTranslatedAttribs() const;
// SignalReceiver implementation
void signal(size_t channelID) override;
void signal(size_t channelID, const gl::Context *context) override;
Serial getCurrentStateSerial() const { return mCurrentStateSerial; }
......
......@@ -396,9 +396,9 @@ enum class StagingAccess
bool UsePresentPathFast(const Renderer11 *renderer, const gl::FramebufferAttachment *colorbuffer);
// Used for state change notifications between buffers and vertex arrays.
using OnBufferDataDirtyBinding = angle::ChannelBinding<size_t>;
using OnBufferDataDirtyChannel = angle::BroadcastChannel<size_t>;
using OnBufferDataDirtyReceiver = angle::SignalReceiver<size_t>;
using OnBufferDataDirtyBinding = angle::ChannelBinding<size_t, const gl::Context *>;
using OnBufferDataDirtyChannel = angle::BroadcastChannel<size_t, const gl::Context *>;
using OnBufferDataDirtyReceiver = angle::SignalReceiver<size_t, const gl::Context *>;
// Used for state change notifications between RenderTarget11 and Framebuffer11.
using OnRenderTargetDirtyBinding = angle::ChannelBinding<size_t>;
......
......@@ -22,7 +22,7 @@ Buffer9::~Buffer9()
mSize = 0;
}
gl::Error Buffer9::setData(const gl::Context * /*context*/,
gl::Error Buffer9::setData(const gl::Context *context,
GLenum /*target*/,
const void *data,
size_t size,
......@@ -42,20 +42,20 @@ gl::Error Buffer9::setData(const gl::Context * /*context*/,
memcpy(mMemory.data(), data, size);
}
updateD3DBufferUsage(usage);
updateD3DBufferUsage(context, usage);
invalidateStaticData();
invalidateStaticData(context);
return gl::NoError();
}
gl::Error Buffer9::getData(const uint8_t **outData)
gl::Error Buffer9::getData(const gl::Context *context, const uint8_t **outData)
{
*outData = mMemory.data();
return gl::NoError();
}
gl::Error Buffer9::setSubData(const gl::Context * /*context*/,
gl::Error Buffer9::setSubData(const gl::Context *context,
GLenum /*target*/,
const void *data,
size_t size,
......@@ -75,7 +75,7 @@ gl::Error Buffer9::setSubData(const gl::Context * /*context*/,
memcpy(mMemory.data() + offset, data, size);
}
invalidateStaticData();
invalidateStaticData(context);
return gl::NoError();
}
......@@ -92,7 +92,7 @@ gl::Error Buffer9::copySubData(const gl::Context *context,
memcpy(mMemory.data() + destOffset, sourceBuffer->mMemory.data() + sourceOffset, size);
invalidateStaticData();
invalidateStaticData(context);
return gl::NoError();
}
......@@ -120,7 +120,7 @@ gl::Error Buffer9::unmap(const gl::Context *context, GLboolean *result)
return gl::InternalError();
}
gl::Error Buffer9::markTransformFeedbackUsage()
gl::Error Buffer9::markTransformFeedbackUsage(const gl::Context *context)
{
UNREACHABLE();
return gl::InternalError();
......
......@@ -26,7 +26,7 @@ class Buffer9 : public BufferD3D
// BufferD3D implementation
virtual size_t getSize() const { return mSize; }
virtual bool supportsDirectBinding() const { return false; }
gl::Error getData(const uint8_t **outData) override;
gl::Error getData(const gl::Context *context, const uint8_t **outData) override;
// BufferImpl implementation
gl::Error setData(const gl::Context *context,
......@@ -51,7 +51,7 @@ class Buffer9 : public BufferD3D
GLbitfield access,
void **mapPtr) override;
gl::Error unmap(const gl::Context *context, GLboolean *result) override;
gl::Error markTransformFeedbackUsage() override;
gl::Error markTransformFeedbackUsage(const gl::Context *context) override;
private:
angle::MemoryBuffer mMemory;
......
......@@ -1311,14 +1311,15 @@ gl::Error Renderer9::applyRenderTarget(const gl::Context *context,
framebuffer->getDepthOrStencilbuffer());
}
gl::Error Renderer9::applyVertexBuffer(const gl::State &state,
gl::Error Renderer9::applyVertexBuffer(const gl::Context *context,
GLenum mode,
GLint first,
GLsizei count,
GLsizei instances,
TranslatedIndexData * /*indexInfo*/)
{
gl::Error error = mVertexDataManager->prepareVertexData(state, first, count,
const gl::State &state = context->getGLState();
gl::Error error = mVertexDataManager->prepareVertexData(context, first, count,
&mTranslatedAttribCache, instances);
if (error.isError())
{
......@@ -1330,17 +1331,17 @@ gl::Error Renderer9::applyVertexBuffer(const gl::State &state,
}
// Applies the indices and element array bindings to the Direct3D 9 device
gl::Error Renderer9::applyIndexBuffer(const gl::ContextState &data,
gl::Error Renderer9::applyIndexBuffer(const gl::Context *context,
const void *indices,
GLsizei count,
GLenum mode,
GLenum type,
TranslatedIndexData *indexInfo)
{
gl::VertexArray *vao = data.getState().getVertexArray();
gl::VertexArray *vao = context->getGLState().getVertexArray();
gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
gl::Error error = mIndexDataManager->prepareIndexData(type, count, elementArrayBuffer, indices,
indexInfo, false);
gl::Error error = mIndexDataManager->prepareIndexData(context, type, count, elementArrayBuffer,
indices, indexInfo, false);
if (error.isError())
{
return error;
......@@ -1360,19 +1361,19 @@ gl::Error Renderer9::applyIndexBuffer(const gl::ContextState &data,
return gl::NoError();
}
gl::Error Renderer9::drawArraysImpl(const gl::ContextState &data,
gl::Error Renderer9::drawArraysImpl(const gl::Context *context,
GLenum mode,
GLint startVertex,
GLsizei count,
GLsizei instances)
{
ASSERT(!data.getState().isTransformFeedbackActiveUnpaused());
ASSERT(!context->getGLState().isTransformFeedbackActiveUnpaused());
startScene();
if (mode == GL_LINE_LOOP)
{
return drawLineLoop(count, GL_NONE, nullptr, 0, nullptr);
return drawLineLoop(context, count, GL_NONE, nullptr, 0, nullptr);
}
else if (instances > 0)
{
......@@ -1412,31 +1413,29 @@ gl::Error Renderer9::drawElementsImpl(const gl::Context *context,
const void *indices,
GLsizei instances)
{
const auto &data = context->getContextState();
TranslatedIndexData indexInfo;
const gl::IndexRange &indexRange =
context->getParams<gl::HasIndexRange>().getIndexRange().value();
indexInfo.indexRange = indexRange;
ANGLE_TRY(applyIndexBuffer(data, indices, count, mode, type, &indexInfo));
ANGLE_TRY(applyIndexBuffer(context, indices, count, mode, type, &indexInfo));
size_t vertexCount = indexInfo.indexRange.vertexCount();
ANGLE_TRY(applyVertexBuffer(data.getState(), mode,
static_cast<GLsizei>(indexInfo.indexRange.start),
ANGLE_TRY(applyVertexBuffer(context, mode, static_cast<GLsizei>(indexInfo.indexRange.start),
static_cast<GLsizei>(vertexCount), instances, &indexInfo));
startScene();
int minIndex = static_cast<int>(indexInfo.indexRange.start);
gl::VertexArray *vao = data.getState().getVertexArray();
gl::VertexArray *vao = context->getGLState().getVertexArray();
gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get();
if (mode == GL_POINTS)
{
return drawIndexedPoints(count, type, indices, minIndex, elementArrayBuffer);
return drawIndexedPoints(context, count, type, indices, minIndex, elementArrayBuffer);
}
else if (mode == GL_LINE_LOOP)
{
return drawLineLoop(count, type, indices, minIndex, elementArrayBuffer);
return drawLineLoop(context, count, type, indices, minIndex, elementArrayBuffer);
}
else
{
......@@ -1450,7 +1449,8 @@ gl::Error Renderer9::drawElementsImpl(const gl::Context *context,
}
}
gl::Error Renderer9::drawLineLoop(GLsizei count,
gl::Error Renderer9::drawLineLoop(const gl::Context *context,
GLsizei count,
GLenum type,
const void *indices,
int minIndex,
......@@ -1462,7 +1462,7 @@ gl::Error Renderer9::drawLineLoop(GLsizei count,
BufferD3D *storage = GetImplAs<BufferD3D>(elementArrayBuffer);
intptr_t offset = reinterpret_cast<intptr_t>(indices);
const uint8_t *bufferData = nullptr;
gl::Error error = storage->getData(&bufferData);
gl::Error error = storage->getData(context, &bufferData);
if (error.isError())
{
return error;
......@@ -1668,7 +1668,8 @@ static gl::Error drawPoints(IDirect3DDevice9 *device,
return gl::NoError();
}
gl::Error Renderer9::drawIndexedPoints(GLsizei count,
gl::Error Renderer9::drawIndexedPoints(const gl::Context *context,
GLsizei count,
GLenum type,
const void *indices,
int minIndex,
......@@ -1683,7 +1684,7 @@ gl::Error Renderer9::drawIndexedPoints(GLsizei count,
intptr_t offset = reinterpret_cast<intptr_t>(indices);
const uint8_t *bufferData = nullptr;
gl::Error error = storage->getData(&bufferData);
gl::Error error = storage->getData(context, &bufferData);
if (error.isError())
{
return error;
......@@ -3135,7 +3136,6 @@ gl::Error Renderer9::genericDrawArrays(const gl::Context *context,
GLsizei count,
GLsizei instances)
{
const auto &data = context->getContextState();
gl::Program *program = context->getGLState().getProgram();
ASSERT(program != nullptr);
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
......@@ -3149,13 +3149,13 @@ gl::Error Renderer9::genericDrawArrays(const gl::Context *context,
}
ANGLE_TRY(updateState(context, mode));
ANGLE_TRY(applyVertexBuffer(data.getState(), mode, first, count, instances, nullptr));
ANGLE_TRY(applyVertexBuffer(context, mode, first, count, instances, nullptr));
ANGLE_TRY(applyTextures(context));
ANGLE_TRY(applyShaders(context, mode));
if (!skipDraw(data.getState(), mode))
if (!skipDraw(context->getGLState(), mode))
{
ANGLE_TRY(drawArraysImpl(data, mode, first, count, instances));
ANGLE_TRY(drawArraysImpl(context, mode, first, count, instances));
}
return gl::NoError();
......
......@@ -145,13 +145,13 @@ class Renderer9 : public RendererD3D
const gl::FramebufferAttachment *depthStencilAttachment);
gl::Error applyUniforms(ProgramD3D *programD3D);
bool applyPrimitiveType(GLenum primitiveType, GLsizei elementCount, bool usesPointSize);
gl::Error applyVertexBuffer(const gl::State &state,
gl::Error applyVertexBuffer(const gl::Context *context,
GLenum mode,
GLint first,
GLsizei count,
GLsizei instances,
TranslatedIndexData *indexInfo);
gl::Error applyIndexBuffer(const gl::ContextState &data,
gl::Error applyIndexBuffer(const gl::Context *context,
const void *indices,
GLsizei count,
GLenum mode,
......@@ -389,7 +389,7 @@ class Renderer9 : public RendererD3D
bool canSelectViewInVertexShader() const override { return false; }
private:
gl::Error drawArraysImpl(const gl::ContextState &data,
gl::Error drawArraysImpl(const gl::Context *context,
GLenum mode,
GLint startVertex,
GLsizei count,
......@@ -424,12 +424,14 @@ class Renderer9 : public RendererD3D
void applyUniformniv(const D3DUniform *targetUniform, const GLint *v);
void applyUniformnbv(const D3DUniform *targetUniform, const GLint *v);
gl::Error drawLineLoop(GLsizei count,
gl::Error drawLineLoop(const gl::Context *context,
GLsizei count,
GLenum type,
const void *indices,
int minIndex,
gl::Buffer *elementArrayBuffer);
gl::Error drawIndexedPoints(GLsizei count,
gl::Error drawIndexedPoints(const gl::Context *context,
GLsizei count,
GLenum type,
const void *indices,
int minIndex,
......
......@@ -193,7 +193,8 @@ gl::Error BufferGL::unmap(const gl::Context *context, GLboolean *result)
return gl::NoError();
}
gl::Error BufferGL::getIndexRange(GLenum type,
gl::Error BufferGL::getIndexRange(const gl::Context *context,
GLenum type,
size_t offset,
size_t count,
bool primitiveRestartEnabled,
......
......@@ -49,7 +49,8 @@ class BufferGL : public BufferImpl
void **mapPtr) override;
gl::Error unmap(const gl::Context *context, GLboolean *result) override;
gl::Error getIndexRange(GLenum type,
gl::Error getIndexRange(const gl::Context *context,
GLenum type,
size_t offset,
size_t count,
bool primitiveRestartEnabled,
......
......@@ -208,7 +208,8 @@ gl::Error VertexArrayGL::syncIndexData(const gl::Context *context,
{
ptrdiff_t elementArrayBufferOffset = reinterpret_cast<ptrdiff_t>(indices);
Error error = mData.getElementArrayBuffer()->getIndexRange(
type, elementArrayBufferOffset, count, primitiveRestartEnabled, outIndexRange);
context, type, elementArrayBufferOffset, count, primitiveRestartEnabled,
outIndexRange);
if (error.isError())
{
return error;
......
......@@ -97,7 +97,8 @@ gl::Error BufferNULL::unmap(const gl::Context *context, GLboolean *result)
return gl::NoError();
}
gl::Error BufferNULL::getIndexRange(GLenum type,
gl::Error BufferNULL::getIndexRange(const gl::Context *context,
GLenum type,
size_t offset,
size_t count,
bool primitiveRestartEnabled,
......
......@@ -46,7 +46,8 @@ class BufferNULL : public BufferImpl
void **mapPtr) override;
gl::Error unmap(const gl::Context *context, GLboolean *result) override;
gl::Error getIndexRange(GLenum type,
gl::Error getIndexRange(const gl::Context *context,
GLenum type,
size_t offset,
size_t count,
bool primitiveRestartEnabled,
......
......@@ -162,7 +162,8 @@ gl::Error BufferVk::unmap(const gl::Context *context, GLboolean *result)
return gl::NoError();
}
gl::Error BufferVk::getIndexRange(GLenum type,
gl::Error BufferVk::getIndexRange(const gl::Context *context,
GLenum type,
size_t offset,
size_t count,
bool primitiveRestartEnabled,
......
......@@ -46,7 +46,8 @@ class BufferVk : public BufferImpl, public ResourceVk
void **mapPtr) override;
gl::Error unmap(const gl::Context *context, GLboolean *result) override;
gl::Error getIndexRange(GLenum type,
gl::Error getIndexRange(const gl::Context *context,
GLenum type,
size_t offset,
size_t count,
bool primitiveRestartEnabled,
......
......@@ -31,8 +31,8 @@ class D3D11EmulatedIndexedBufferTest : public ANGLETest
ANGLETest::SetUp();
ASSERT_EQ(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, GetParam().getRenderer());
gl::Context *context = reinterpret_cast<gl::Context *>(getEGLWindow()->getContext());
rx::Context11 *context11 = rx::GetImplAs<rx::Context11>(context);
mContext = reinterpret_cast<gl::Context *>(getEGLWindow()->getContext());
rx::Context11 *context11 = rx::GetImplAs<rx::Context11>(mContext);
mRenderer = context11->getRenderer();
mSourceBuffer = new rx::Buffer11(mBufferState, mRenderer);
......@@ -112,7 +112,7 @@ class D3D11EmulatedIndexedBufferTest : public ANGLETest
void emulateAndCompare(rx::SourceIndexData *srcData)
{
auto bufferOrError =
mSourceBuffer->getEmulatedIndexedBuffer(srcData, mTranslatedAttribute, 0);
mSourceBuffer->getEmulatedIndexedBuffer(mContext, srcData, mTranslatedAttribute, 0);
ASSERT_FALSE(bufferOrError.isError());
ID3D11Buffer *emulatedBuffer = bufferOrError.getResult();
ASSERT_TRUE(emulatedBuffer != nullptr);
......@@ -120,6 +120,7 @@ class D3D11EmulatedIndexedBufferTest : public ANGLETest
}
protected:
gl::Context *mContext;
rx::Buffer11 *mSourceBuffer;
rx::Renderer11 *mRenderer;
rx::TranslatedAttribute mTranslatedAttribute;
......@@ -179,10 +180,10 @@ TEST_P(D3D11EmulatedIndexedBufferTest, TestSourceBufferRemainsUntouchedAfterExpa
const uint8_t *sourceBufferMem = nullptr;
const uint8_t *cleanBufferMem = nullptr;
gl::Error error = mSourceBuffer->getData(&sourceBufferMem);
gl::Error error = mSourceBuffer->getData(mContext, &sourceBufferMem);
ASSERT_FALSE(error.isError());
error = cleanSourceBuffer->getData(&cleanBufferMem);
error = cleanSourceBuffer->getData(mContext, &cleanBufferMem);
ASSERT_FALSE(error.isError());
int result = memcmp(sourceBufferMem, cleanBufferMem, cleanSourceBuffer->getSize());
......
......@@ -100,13 +100,13 @@ class MockBufferD3D : public rx::BufferD3D
MOCK_METHOD2(unmap, gl::Error(const gl::Context *context, GLboolean *));
// BufferD3D
MOCK_METHOD0(markTransformFeedbackUsage, gl::Error());
MOCK_METHOD1(markTransformFeedbackUsage, gl::Error(const gl::Context *));
// inlined for speed
bool supportsDirectBinding() const override { return false; }
size_t getSize() const override { return mData.size(); }
gl::Error getData(const uint8_t **outData) override
gl::Error getData(const gl::Context *context, const uint8_t **outData) override
{
*outData = &mData[0];
return gl::NoError();
......@@ -129,7 +129,7 @@ class MockGLFactoryD3D : public rx::MockGLFactory
EXPECT_CALL(*mBufferFactory, createVertexBuffer())
.WillOnce(Return(nullptr))
.RetiresOnSaturation();
mockBufferD3D->initializeStaticData();
mockBufferD3D->initializeStaticData(nullptr);
return mockBufferD3D;
}
......@@ -177,10 +177,11 @@ void IndexDataManagerPerfTest::step()
rx::TranslatedIndexData translatedIndexData;
for (unsigned int iteration = 0; iteration < 100; ++iteration)
{
(void)mIndexBuffer.getIndexRange(GL_UNSIGNED_SHORT, 0, mIndexCount, false,
(void)mIndexBuffer.getIndexRange(nullptr, GL_UNSIGNED_SHORT, 0, mIndexCount, false,
&translatedIndexData.indexRange);
(void)mIndexDataManager.prepareIndexData(GL_UNSIGNED_SHORT, mIndexCount, &mIndexBuffer,
nullptr, &translatedIndexData, false);
(void)mIndexDataManager.prepareIndexData(nullptr, GL_UNSIGNED_SHORT, mIndexCount,
&mIndexBuffer, nullptr, &translatedIndexData,
false);
}
}
......
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