Commit 9d815378 by Jamie Madill Committed by Commit Bot

D3D: Refactor driver uniform application.

This is a preparation for more dirty bits. It moves the driver constant buffer application into the state manager, redesigns how the dirtiness is tracked (no more memcmp) and also removes a couple of virtual calls. BUG=angleproject:1390 BUG=angleproject:2052 Change-Id: I41a75c280600ad8ba1f23c721d436214a116422a Reviewed-on: https://chromium-review.googlesource.com/659223 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 33bb7c42
...@@ -1765,22 +1765,6 @@ void ProgramD3D::initializeUniformStorage() ...@@ -1765,22 +1765,6 @@ void ProgramD3D::initializeUniformStorage()
} }
} }
gl::Error ProgramD3D::applyUniforms()
{
ASSERT(!mDirtySamplerMapping);
ANGLE_TRY(mRenderer->applyUniforms(*this, mD3DUniforms));
mUniformsDirty = false;
return gl::NoError();
}
gl::Error ProgramD3D::applyComputeUniforms()
{
ASSERT(!mDirtySamplerMapping);
ANGLE_TRY(mRenderer->applyComputeUniforms(*this, mD3DUniforms));
mUniformsDirty = false;
return gl::NoError();
}
gl::Error ProgramD3D::applyUniformBuffers(const gl::ContextState &data) gl::Error ProgramD3D::applyUniformBuffers(const gl::ContextState &data)
{ {
if (mState.getUniformBlocks().empty()) if (mState.getUniformBlocks().empty())
......
...@@ -208,8 +208,6 @@ class ProgramD3D : public ProgramImpl ...@@ -208,8 +208,6 @@ class ProgramD3D : public ProgramImpl
const GLfloat *coeffs) override; const GLfloat *coeffs) override;
void initializeUniformStorage(); void initializeUniformStorage();
gl::Error applyUniforms();
gl::Error applyComputeUniforms();
gl::Error applyUniformBuffers(const gl::ContextState &data); gl::Error applyUniformBuffers(const gl::ContextState &data);
void dirtyAllUniforms(); void dirtyAllUniforms();
...@@ -290,6 +288,8 @@ class ProgramD3D : public ProgramImpl ...@@ -290,6 +288,8 @@ class ProgramD3D : public ProgramImpl
bool hasPixelExecutableForCachedOutputLayout(); bool hasPixelExecutableForCachedOutputLayout();
bool areUniformsDirty() const { return mUniformsDirty; } bool areUniformsDirty() const { return mUniformsDirty; }
const std::vector<D3DUniform *> &getD3DUniforms() const { return mD3DUniforms; }
void markUniformsClean() { mUniformsDirty = false; }
private: private:
// These forward-declared tasks are used for multi-thread shader compiles. // These forward-declared tasks are used for multi-thread shader compiles.
......
...@@ -154,9 +154,6 @@ class RendererD3D : public BufferFactoryD3D ...@@ -154,9 +154,6 @@ class RendererD3D : public BufferFactoryD3D
const std::vector<GLint> &vertexUniformBuffers, const std::vector<GLint> &vertexUniformBuffers,
const std::vector<GLint> &fragmentUniformBuffers) = 0; const std::vector<GLint> &fragmentUniformBuffers) = 0;
virtual gl::Error applyUniforms(const ProgramD3D &programD3D,
const std::vector<D3DUniform *> &uniformArray) = 0;
virtual unsigned int getReservedVertexUniformBuffers() const = 0; virtual unsigned int getReservedVertexUniformBuffers() const = 0;
virtual unsigned int getReservedFragmentUniformBuffers() const = 0; virtual unsigned int getReservedFragmentUniformBuffers() const = 0;
...@@ -319,9 +316,6 @@ class RendererD3D : public BufferFactoryD3D ...@@ -319,9 +316,6 @@ class RendererD3D : public BufferFactoryD3D
angle::WorkerThreadPool *getWorkerThreadPool(); angle::WorkerThreadPool *getWorkerThreadPool();
virtual gl::Error applyComputeUniforms(const ProgramD3D &programD3D,
const std::vector<D3DUniform *> &uniformArray) = 0;
bool isRobustResourceInitEnabled() const; bool isRobustResourceInitEnabled() const;
size_t getBoundFramebufferTextures(const gl::ContextState &data, size_t getBoundFramebufferTextures(const gl::ContextState &data,
......
...@@ -151,11 +151,6 @@ class Renderer11 : public RendererD3D ...@@ -151,11 +151,6 @@ class Renderer11 : public RendererD3D
const std::vector<GLint> &fragmentUniformBuffers) override; const std::vector<GLint> &fragmentUniformBuffers) override;
bool applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize); bool applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize);
gl::Error applyUniforms(const ProgramD3D &programD3D,
const std::vector<D3DUniform *> &uniformArray) override;
gl::Error applyDriverUniforms(const ProgramD3D &programD3D, GLenum drawMode);
gl::Error applyTransformFeedbackBuffers(const gl::ContextState &data); gl::Error applyTransformFeedbackBuffers(const gl::ContextState &data);
// lost device // lost device
...@@ -419,8 +414,6 @@ class Renderer11 : public RendererD3D ...@@ -419,8 +414,6 @@ class Renderer11 : public RendererD3D
GLuint numGroupsX, GLuint numGroupsX,
GLuint numGroupsY, GLuint numGroupsY,
GLuint numGroupsZ); GLuint numGroupsZ);
gl::Error applyComputeUniforms(const ProgramD3D &programD3D,
const std::vector<D3DUniform *> &uniformArray) override;
gl::Error applyComputeShader(const gl::Context *context); gl::Error applyComputeShader(const gl::Context *context);
gl::ErrorOrResult<TextureHelper11> createStagingTexture(ResourceType textureType, gl::ErrorOrResult<TextureHelper11> createStagingTexture(ResourceType textureType,
...@@ -518,13 +511,6 @@ class Renderer11 : public RendererD3D ...@@ -518,13 +511,6 @@ class Renderer11 : public RendererD3D
void updateHistograms(); void updateHistograms();
template <class TShaderConstants>
void applyDriverConstantsIfNeeded(TShaderConstants *appliedConstants,
const TShaderConstants &constants,
SamplerMetadata11 *samplerMetadata,
size_t samplerMetadataReferencedBytes,
const d3d11::Buffer &driverConstantBuffer);
gl::Error copyImageInternal(const gl::Context *context, gl::Error copyImageInternal(const gl::Context *context,
const gl::Framebuffer *framebuffer, const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect, const gl::Rectangle &sourceRect,
...@@ -561,26 +547,13 @@ class Renderer11 : public RendererD3D ...@@ -561,26 +547,13 @@ class Renderer11 : public RendererD3D
// Currently applied transform feedback buffers // Currently applied transform feedback buffers
uintptr_t mAppliedTFObject; uintptr_t mAppliedTFObject;
dx_VertexConstants11 mAppliedVertexConstants;
d3d11::Buffer mDriverConstantBufferVS;
uintptr_t mCurrentVertexConstantBuffer;
unsigned int mCurrentConstantBufferVS[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS]; unsigned int mCurrentConstantBufferVS[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS];
GLintptr mCurrentConstantBufferVSOffset[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS]; GLintptr mCurrentConstantBufferVSOffset[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS];
GLsizeiptr mCurrentConstantBufferVSSize[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS]; GLsizeiptr mCurrentConstantBufferVSSize[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS];
dx_PixelConstants11 mAppliedPixelConstants;
d3d11::Buffer mDriverConstantBufferPS;
uintptr_t mCurrentPixelConstantBuffer;
unsigned int mCurrentConstantBufferPS[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS]; unsigned int mCurrentConstantBufferPS[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS];
GLintptr mCurrentConstantBufferPSOffset[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS]; GLintptr mCurrentConstantBufferPSOffset[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS];
GLsizeiptr mCurrentConstantBufferPSSize[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS]; GLsizeiptr mCurrentConstantBufferPSSize[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS];
dx_ComputeConstants11 mAppliedComputeConstants;
d3d11::Buffer mDriverConstantBufferCS;
uintptr_t mCurrentComputeConstantBuffer;
uintptr_t mCurrentGeometryConstantBuffer;
StreamingIndexBufferInterface *mLineLoopIB; StreamingIndexBufferInterface *mLineLoopIB;
StreamingIndexBufferInterface *mTriangleFanIB; StreamingIndexBufferInterface *mTriangleFanIB;
......
...@@ -27,89 +27,117 @@ namespace rx ...@@ -27,89 +27,117 @@ namespace rx
struct RenderTargetDesc; struct RenderTargetDesc;
struct Renderer11DeviceCaps; struct Renderer11DeviceCaps;
struct dx_VertexConstants11 class ShaderConstants11 : angle::NonCopyable
{ {
dx_VertexConstants11() public:
: depthRange{.0f}, ShaderConstants11();
viewAdjust{.0f},
viewCoords{.0f}, void init(const gl::Caps &caps);
viewScale{.0f}, size_t getRequiredBufferSize(gl::SamplerType samplerType) const;
multiviewWriteToViewportIndex{.0f}, void markDirty();
padding{.0f}
{ void setComputeWorkGroups(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ);
} void setMultiviewWriteToViewportIndex(GLfloat index);
float depthRange[4]; void onViewportChange(const gl::Rectangle &glViewport,
float viewAdjust[4]; const D3D11_VIEWPORT &dxViewport,
float viewCoords[4]; bool is9_3,
float viewScale[2]; bool presentPathFast);
// multiviewWriteToViewportIndex is used to select either the side-by-side or layered code-path void onSamplerChange(gl::SamplerType samplerType,
// in the GS. It's value, if set, is either 0.0f or 1.0f. The value is updated whenever a unsigned int samplerIndex,
// multi-view draw framebuffer is made active. const gl::Texture &texture);
float multiviewWriteToViewportIndex;
gl::Error updateBuffer(ID3D11DeviceContext *deviceContext,
// Added here to manually pad the struct. gl::SamplerType samplerType,
float padding; const ProgramD3D &programD3D,
}; const d3d11::Buffer &driverConstantBuffer);
struct dx_PixelConstants11 private:
{ struct Vertex
dx_PixelConstants11()
: depthRange{.0f},
viewCoords{.0f},
depthFront{.0f},
viewScale{.0f},
multiviewWriteToViewportIndex{.0f},
padding{.0f}
{ {
} Vertex()
: depthRange{.0f},
float depthRange[4]; viewAdjust{.0f},
float viewCoords[4]; viewCoords{.0f},
float depthFront[4]; viewScale{.0f},
float viewScale[2]; multiviewWriteToViewportIndex{.0f},
// multiviewWriteToViewportIndex is used to select either the side-by-side or layered code-path padding{.0f}
// in the GS. It's value, if set, is either 0.0f or 1.0f. The value is updated whenever a {
// multi-view draw framebuffer is made active. }
float multiviewWriteToViewportIndex;
float depthRange[4];
// Added here to manually pad the struct. float viewAdjust[4];
float padding; float viewCoords[4];
}; float viewScale[2];
// multiviewWriteToViewportIndex is used to select either the side-by-side or layered
// code-path in the GS. It's value, if set, is either 0.0f or 1.0f. The value is updated
// whenever a multi-view draw framebuffer is made active.
float multiviewWriteToViewportIndex;
// Added here to manually pad the struct.
float padding;
};
struct dx_ComputeConstants11 struct Pixel
{ {
dx_ComputeConstants11() : numWorkGroups{0u}, padding{0u} {} Pixel()
unsigned int numWorkGroups[3]; : depthRange{.0f},
unsigned int padding; // This just pads the struct to 16 bytes viewCoords{.0f},
}; depthFront{.0f},
viewScale{.0f},
multiviewWriteToViewportIndex(0),
padding(0)
{
}
float depthRange[4];
float viewCoords[4];
float depthFront[4];
float viewScale[2];
// multiviewWriteToViewportIndex is used to select either the side-by-side or layered
// code-path in the GS. It's value, if set, is either 0.0f or 1.0f. The value is updated
// whenever a multi-view draw framebuffer is made active.
float multiviewWriteToViewportIndex;
// Added here to manually pad the struct.
float padding;
};
class SamplerMetadata11 final : angle::NonCopyable struct Compute
{ {
public: Compute() : numWorkGroups{0u}, padding(0u) {}
SamplerMetadata11(); unsigned int numWorkGroups[3];
~SamplerMetadata11(); unsigned int padding; // This just pads the struct to 16 bytes
};
struct dx_SamplerMetadata struct SamplerMetadata
{ {
SamplerMetadata() : baseLevel(0), internalFormatBits(0), wrapModes(0), padding(0) {}
int baseLevel; int baseLevel;
int internalFormatBits; int internalFormatBits;
int wrapModes; int wrapModes;
int padding; // This just pads the struct to 16 bytes int padding; // This just pads the struct to 16 bytes
}; };
static_assert(sizeof(dx_SamplerMetadata) == 16u,
"Sampler metadata struct must be one 4-vec / 16 bytes.");
void initData(unsigned int samplerCount);
void update(unsigned int samplerIndex, const gl::Texture &texture);
const dx_SamplerMetadata *getData() const; static_assert(sizeof(SamplerMetadata) == 16u,
size_t sizeBytes() const; "Sampler metadata struct must be one 4-vec / 16 bytes.");
bool isDirty() const { return mDirty; }
void markClean() { mDirty = false; }
private: // Return true if dirty.
std::vector<dx_SamplerMetadata> mSamplerMetadata; bool updateSamplerMetadata(SamplerMetadata *data, const gl::Texture &texture);
bool mDirty;
Vertex mVertex;
bool mVertexDirty;
Pixel mPixel;
bool mPixelDirty;
Compute mCompute;
bool mComputeDirty;
std::vector<SamplerMetadata> mSamplerMetadataVS;
bool mSamplerMetadataVSDirty;
std::vector<SamplerMetadata> mSamplerMetadataPS;
bool mSamplerMetadataPSDirty;
std::vector<SamplerMetadata> mSamplerMetadataCS;
bool mSamplerMetadataCSDirty;
}; };
class StateManager11 final : angle::NonCopyable class StateManager11 final : angle::NonCopyable
...@@ -123,15 +151,6 @@ class StateManager11 final : angle::NonCopyable ...@@ -123,15 +151,6 @@ class StateManager11 final : angle::NonCopyable
void syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits); void syncState(const gl::Context *context, const gl::State::DirtyBits &dirtyBits);
// TODO(jmadill): Don't expose these.
const dx_VertexConstants11 &getVertexConstants() const { return mVertexConstants; }
const dx_PixelConstants11 &getPixelConstants() const { return mPixelConstants; }
const dx_ComputeConstants11 &getComputeConstants() const { return mComputeConstants; }
SamplerMetadata11 *getVertexSamplerMetadata() { return &mSamplerMetadataVS; }
SamplerMetadata11 *getPixelSamplerMetadata() { return &mSamplerMetadataPS; }
SamplerMetadata11 *getComputeSamplerMetadata() { return &mSamplerMetadataCS; }
gl::Error updateStateForCompute(const gl::Context *context, gl::Error updateStateForCompute(const gl::Context *context,
GLuint numGroupsX, GLuint numGroupsX,
GLuint numGroupsY, GLuint numGroupsY,
...@@ -152,6 +171,7 @@ class StateManager11 final : angle::NonCopyable ...@@ -152,6 +171,7 @@ class StateManager11 final : angle::NonCopyable
void invalidateViewport(const gl::Context *context); void invalidateViewport(const gl::Context *context);
void invalidateTexturesAndSamplers(); void invalidateTexturesAndSamplers();
void invalidateSwizzles(); void invalidateSwizzles();
void invalidateDriverUniforms();
// Called from VertexArray11::updateVertexAttribStorage. // Called from VertexArray11::updateVertexAttribStorage.
void invalidateCurrentValueAttrib(size_t attribIndex); void invalidateCurrentValueAttrib(size_t attribIndex);
...@@ -214,6 +234,9 @@ class StateManager11 final : angle::NonCopyable ...@@ -214,6 +234,9 @@ class StateManager11 final : angle::NonCopyable
gl::Error updateVertexOffsetsForPointSpritesEmulation(GLint startVertex, gl::Error updateVertexOffsetsForPointSpritesEmulation(GLint startVertex,
GLsizei emulatedInstanceId); GLsizei emulatedInstanceId);
// TODO(jmadill): Should be private.
gl::Error applyComputeUniforms(ProgramD3D *programD3D);
// Only used in testing. // Only used in testing.
InputLayoutCache *getInputLayoutCache() { return &mInputLayoutCache; } InputLayoutCache *getInputLayoutCache() { return &mInputLayoutCache; }
...@@ -269,6 +292,9 @@ class StateManager11 final : angle::NonCopyable ...@@ -269,6 +292,9 @@ class StateManager11 final : angle::NonCopyable
gl::Error generateSwizzlesForShader(const gl::Context *context, gl::SamplerType type); gl::Error generateSwizzlesForShader(const gl::Context *context, gl::SamplerType type);
gl::Error generateSwizzles(const gl::Context *context); gl::Error generateSwizzles(const gl::Context *context);
gl::Error applyDriverUniforms(const ProgramD3D &programD3D, GLenum drawMode);
gl::Error applyUniforms(ProgramD3D *programD3D);
enum DirtyBitType enum DirtyBitType
{ {
DIRTY_BIT_RENDER_TARGET, DIRTY_BIT_RENDER_TARGET,
...@@ -320,10 +346,7 @@ class StateManager11 final : angle::NonCopyable ...@@ -320,10 +346,7 @@ class StateManager11 final : angle::NonCopyable
std::vector<gl::Offset> mViewportOffsets; std::vector<gl::Offset> mViewportOffsets;
// Things needed in viewport state // Things needed in viewport state
dx_VertexConstants11 mVertexConstants; ShaderConstants11 mShaderConstants;
dx_PixelConstants11 mPixelConstants;
dx_ComputeConstants11 mComputeConstants;
// Render target variables // Render target variables
gl::Extents mViewportBounds; gl::Extents mViewportBounds;
...@@ -406,10 +429,6 @@ class StateManager11 final : angle::NonCopyable ...@@ -406,10 +429,6 @@ class StateManager11 final : angle::NonCopyable
std::vector<bool> mForceSetComputeSamplerStates; std::vector<bool> mForceSetComputeSamplerStates;
std::vector<gl::SamplerState> mCurComputeSamplerStates; std::vector<gl::SamplerState> mCurComputeSamplerStates;
SamplerMetadata11 mSamplerMetadataVS;
SamplerMetadata11 mSamplerMetadataPS;
SamplerMetadata11 mSamplerMetadataCS;
// Special dirty bit for swizzles. Since they use internal shaders, must be done in a pre-pass. // Special dirty bit for swizzles. Since they use internal shaders, must be done in a pre-pass.
bool mDirtySwizzles; bool mDirtySwizzles;
...@@ -428,6 +447,16 @@ class StateManager11 final : angle::NonCopyable ...@@ -428,6 +447,16 @@ class StateManager11 final : angle::NonCopyable
// ANGLE_multiview. // ANGLE_multiview.
bool mIsMultiviewEnabled; bool mIsMultiviewEnabled;
// Driver Constants.
d3d11::Buffer mDriverConstantBufferVS;
d3d11::Buffer mDriverConstantBufferPS;
d3d11::Buffer mDriverConstantBufferCS;
ResourceSerial mCurrentVertexConstantBuffer;
ResourceSerial mCurrentPixelConstantBuffer;
ResourceSerial mCurrentComputeConstantBuffer;
ResourceSerial mCurrentGeometryConstantBuffer;
}; };
} // namespace rx } // namespace rx
......
...@@ -1842,7 +1842,7 @@ gl::Error Renderer9::applyShaders(const gl::Context *context, GLenum drawMode) ...@@ -1842,7 +1842,7 @@ gl::Error Renderer9::applyShaders(const gl::Context *context, GLenum drawMode)
mAppliedProgramSerial = programSerial; mAppliedProgramSerial = programSerial;
} }
ANGLE_TRY(programD3D->applyUniforms()); ANGLE_TRY(applyUniforms(programD3D));
// Driver uniforms // Driver uniforms
mStateManager.setShaderConstants(); mStateManager.setShaderConstants();
...@@ -1850,16 +1850,18 @@ gl::Error Renderer9::applyShaders(const gl::Context *context, GLenum drawMode) ...@@ -1850,16 +1850,18 @@ gl::Error Renderer9::applyShaders(const gl::Context *context, GLenum drawMode)
return gl::NoError(); return gl::NoError();
} }
gl::Error Renderer9::applyUniforms(const ProgramD3D &programD3D, gl::Error Renderer9::applyUniforms(ProgramD3D *programD3D)
const std::vector<D3DUniform *> &uniformArray)
{ {
for (const D3DUniform *targetUniform : uniformArray) // Skip updates if we're not dirty.
if (!programD3D->areUniformsDirty())
{ {
// Built-in uniforms must be skipped. return gl::NoError();
if (!targetUniform->isReferencedByFragmentShader() && }
!targetUniform->isReferencedByVertexShader())
continue;
const auto &uniformArray = programD3D->getD3DUniforms();
for (const D3DUniform *targetUniform : uniformArray)
{
// Built-in uniforms must be skipped. // Built-in uniforms must be skipped.
if (!targetUniform->isReferencedByFragmentShader() && if (!targetUniform->isReferencedByFragmentShader() &&
!targetUniform->isReferencedByVertexShader()) !targetUniform->isReferencedByVertexShader())
...@@ -1900,6 +1902,7 @@ gl::Error Renderer9::applyUniforms(const ProgramD3D &programD3D, ...@@ -1900,6 +1902,7 @@ gl::Error Renderer9::applyUniforms(const ProgramD3D &programD3D,
} }
} }
programD3D->markUniformsClean();
return gl::NoError(); return gl::NoError();
} }
...@@ -3225,13 +3228,6 @@ gl::Version Renderer9::getMaxSupportedESVersion() const ...@@ -3225,13 +3228,6 @@ gl::Version Renderer9::getMaxSupportedESVersion() const
return gl::Version(2, 0); return gl::Version(2, 0);
} }
gl::Error Renderer9::applyComputeUniforms(const ProgramD3D &programD3D,
const std::vector<D3DUniform *> &uniformArray)
{
UNIMPLEMENTED();
return gl::InternalError() << "Compute shader is not implemented on D3D9";
}
gl::Error Renderer9::clearRenderTarget(RenderTargetD3D *renderTarget, gl::Error Renderer9::clearRenderTarget(RenderTargetD3D *renderTarget,
const gl::ColorF &clearColorValue, const gl::ColorF &clearColorValue,
const float clearDepthValue, const float clearDepthValue,
......
...@@ -147,8 +147,7 @@ class Renderer9 : public RendererD3D ...@@ -147,8 +147,7 @@ class Renderer9 : public RendererD3D
gl::Error applyRenderTarget(const gl::Context *context, gl::Error applyRenderTarget(const gl::Context *context,
const gl::FramebufferAttachment *colorAttachment, const gl::FramebufferAttachment *colorAttachment,
const gl::FramebufferAttachment *depthStencilAttachment); const gl::FramebufferAttachment *depthStencilAttachment);
gl::Error applyUniforms(const ProgramD3D &programD3D, gl::Error applyUniforms(ProgramD3D *programD3D);
const std::vector<D3DUniform *> &uniformArray) override;
bool applyPrimitiveType(GLenum primitiveType, GLsizei elementCount, bool usesPointSize); bool applyPrimitiveType(GLenum primitiveType, GLsizei elementCount, bool usesPointSize);
gl::Error applyVertexBuffer(const gl::State &state, gl::Error applyVertexBuffer(const gl::State &state,
GLenum mode, GLenum mode,
...@@ -390,9 +389,6 @@ class Renderer9 : public RendererD3D ...@@ -390,9 +389,6 @@ class Renderer9 : public RendererD3D
gl::Version getMaxSupportedESVersion() const override; gl::Version getMaxSupportedESVersion() const override;
gl::Error applyComputeUniforms(const ProgramD3D &programD3D,
const std::vector<D3DUniform *> &uniformArray) override;
gl::Error clearRenderTarget(RenderTargetD3D *renderTarget, gl::Error clearRenderTarget(RenderTargetD3D *renderTarget,
const gl::ColorF &clearColorValue, const gl::ColorF &clearColorValue,
const float clearDepthValue, const float clearDepthValue,
......
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