Commit 3110ffdc by Geoff Lang

Updated the swizzle generation functions to use Error objects.

BUG=angle:520 Change-Id: I01b3cdb7d6719582fa8a57f21218705f6743a7b0 Reviewed-on: https://chromium-review.googlesource.com/217103Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 950cb606
...@@ -1390,7 +1390,7 @@ void Context::applyShaders(ProgramBinary *programBinary, bool transformFeedbackA ...@@ -1390,7 +1390,7 @@ void Context::applyShaders(ProgramBinary *programBinary, bool transformFeedbackA
programBinary->applyUniforms(); programBinary->applyUniforms();
} }
void Context::generateSwizzles(ProgramBinary *programBinary, SamplerType type) Error Context::generateSwizzles(ProgramBinary *programBinary, SamplerType type)
{ {
size_t samplerRange = programBinary->getUsedSamplerRange(type); size_t samplerRange = programBinary->getUsedSamplerRange(type);
...@@ -1403,16 +1403,33 @@ void Context::generateSwizzles(ProgramBinary *programBinary, SamplerType type) ...@@ -1403,16 +1403,33 @@ void Context::generateSwizzles(ProgramBinary *programBinary, SamplerType type)
Texture* texture = getSamplerTexture(textureUnit, textureType); Texture* texture = getSamplerTexture(textureUnit, textureType);
if (texture->getSamplerState().swizzleRequired()) if (texture->getSamplerState().swizzleRequired())
{ {
mRenderer->generateSwizzle(texture); Error error = mRenderer->generateSwizzle(texture);
if (error.isError())
{
return error;
}
} }
} }
} }
return Error(GL_NO_ERROR);
} }
void Context::generateSwizzles(ProgramBinary *programBinary) Error Context::generateSwizzles(ProgramBinary *programBinary)
{ {
generateSwizzles(programBinary, SAMPLER_VERTEX); Error error = generateSwizzles(programBinary, SAMPLER_VERTEX);
generateSwizzles(programBinary, SAMPLER_PIXEL); if (error.isError())
{
return error;
}
error = generateSwizzles(programBinary, SAMPLER_PIXEL);
if (error.isError())
{
return error;
}
return Error(GL_NO_ERROR);
} }
// For each Direct3D sampler of either the pixel or vertex stage, // For each Direct3D sampler of either the pixel or vertex stage,
...@@ -1673,7 +1690,11 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan ...@@ -1673,7 +1690,11 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan
ProgramBinary *programBinary = mState.getCurrentProgramBinary(); ProgramBinary *programBinary = mState.getCurrentProgramBinary();
programBinary->updateSamplerMapping(); programBinary->updateSamplerMapping();
generateSwizzles(programBinary); Error error = generateSwizzles(programBinary);
if (error.isError())
{
return gl::error(error.getCode());
}
if (!mRenderer->applyPrimitiveType(mode, count)) if (!mRenderer->applyPrimitiveType(mode, count))
{ {
...@@ -1683,7 +1704,7 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan ...@@ -1683,7 +1704,7 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan
applyRenderTarget(mode, false); applyRenderTarget(mode, false);
applyState(mode); applyState(mode);
Error error = mRenderer->applyVertexBuffer(programBinary, mState.getVertexArray()->getVertexAttributes(), mState.getVertexAttribCurrentValues(), first, count, instances); error = mRenderer->applyVertexBuffer(programBinary, mState.getVertexArray()->getVertexAttributes(), mState.getVertexAttribCurrentValues(), first, count, instances);
if (error.isError()) if (error.isError())
{ {
return gl::error(error.getCode()); return gl::error(error.getCode());
...@@ -1720,7 +1741,11 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type, ...@@ -1720,7 +1741,11 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type,
ProgramBinary *programBinary = mState.getCurrentProgramBinary(); ProgramBinary *programBinary = mState.getCurrentProgramBinary();
programBinary->updateSamplerMapping(); programBinary->updateSamplerMapping();
generateSwizzles(programBinary); Error error = generateSwizzles(programBinary);
if (error.isError())
{
return gl::error(error.getCode());
}
if (!mRenderer->applyPrimitiveType(mode, count)) if (!mRenderer->applyPrimitiveType(mode, count))
{ {
...@@ -1733,7 +1758,7 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type, ...@@ -1733,7 +1758,7 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type,
VertexArray *vao = mState.getVertexArray(); VertexArray *vao = mState.getVertexArray();
rx::TranslatedIndexData indexInfo; rx::TranslatedIndexData indexInfo;
indexInfo.indexRange = indexRange; indexInfo.indexRange = indexRange;
Error error = mRenderer->applyIndexBuffer(indices, vao->getElementArrayBuffer(), count, mode, type, &indexInfo); error = mRenderer->applyIndexBuffer(indices, vao->getElementArrayBuffer(), count, mode, type, &indexInfo);
if (error.isError()) if (error.isError())
{ {
return gl::error(error.getCode()); return gl::error(error.getCode());
......
...@@ -249,8 +249,8 @@ class Context ...@@ -249,8 +249,8 @@ class Context
void detachTransformFeedback(GLuint transformFeedback); void detachTransformFeedback(GLuint transformFeedback);
void detachSampler(GLuint sampler); void detachSampler(GLuint sampler);
void generateSwizzles(ProgramBinary *programBinary, SamplerType type); Error generateSwizzles(ProgramBinary *programBinary, SamplerType type);
void generateSwizzles(ProgramBinary *programBinary); Error generateSwizzles(ProgramBinary *programBinary);
Texture *getIncompleteTexture(GLenum type); Texture *getIncompleteTexture(GLenum type);
......
...@@ -109,7 +109,7 @@ class Renderer ...@@ -109,7 +109,7 @@ class Renderer
virtual SwapChain *createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat) = 0; virtual SwapChain *createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat) = 0;
virtual void generateSwizzle(gl::Texture *texture) = 0; virtual gl::Error generateSwizzle(gl::Texture *texture) = 0;
virtual void setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &sampler) = 0; virtual void setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &sampler) = 0;
virtual void setTexture(gl::SamplerType type, int index, gl::Texture *texture) = 0; virtual void setTexture(gl::SamplerType type, int index, gl::Texture *texture) = 0;
......
...@@ -368,8 +368,8 @@ static inline unsigned int GetSwizzleIndex(GLenum swizzle) ...@@ -368,8 +368,8 @@ static inline unsigned int GetSwizzleIndex(GLenum swizzle)
return colorIndex; return colorIndex;
} }
bool Blit11::swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTargetView *dest, const gl::Extents &size, gl::Error Blit11::swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTargetView *dest, const gl::Extents &size,
GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha) GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha)
{ {
HRESULT result; HRESULT result;
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext(); ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
...@@ -407,7 +407,7 @@ bool Blit11::swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTarget ...@@ -407,7 +407,7 @@ bool Blit11::swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTarget
if (i == mSwizzleShaderMap.end()) if (i == mSwizzleShaderMap.end())
{ {
UNREACHABLE(); UNREACHABLE();
return false; return gl::Error(GL_INVALID_OPERATION, "Internal error, missing swizzle shader.");
} }
const Shader &shader = i->second; const Shader &shader = i->second;
...@@ -417,8 +417,7 @@ bool Blit11::swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTarget ...@@ -417,8 +417,7 @@ bool Blit11::swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTarget
result = deviceContext->Map(mVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); result = deviceContext->Map(mVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(result)) if (FAILED(result))
{ {
ERR("Failed to map vertex buffer for texture swizzle, HRESULT: 0x%X.", result); return gl::Error(GL_OUT_OF_MEMORY, "Failed to map internal vertex buffer for swizzle, HRESULT: 0x%X.", result);
return false;
} }
UINT stride = 0; UINT stride = 0;
...@@ -435,8 +434,7 @@ bool Blit11::swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTarget ...@@ -435,8 +434,7 @@ bool Blit11::swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTarget
result = deviceContext->Map(mSwizzleCB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); result = deviceContext->Map(mSwizzleCB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(result)) if (FAILED(result))
{ {
ERR("Failed to map constant buffer for texture swizzle, HRESULT: 0x%X.", result); return gl::Error(GL_OUT_OF_MEMORY, "Failed to map internal constant buffer for swizzle, HRESULT: 0x%X.", result);
return false;
} }
unsigned int *swizzleIndices = reinterpret_cast<unsigned int*>(mappedResource.pData); unsigned int *swizzleIndices = reinterpret_cast<unsigned int*>(mappedResource.pData);
...@@ -503,7 +501,7 @@ bool Blit11::swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTarget ...@@ -503,7 +501,7 @@ bool Blit11::swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTarget
mRenderer->markAllStateDirty(); mRenderer->markAllStateDirty();
return true; return gl::Error(GL_NO_ERROR);
} }
bool Blit11::copyTexture(ID3D11ShaderResourceView *source, const gl::Box &sourceArea, const gl::Extents &sourceSize, bool Blit11::copyTexture(ID3D11ShaderResourceView *source, const gl::Box &sourceArea, const gl::Extents &sourceSize,
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "common/angleutils.h" #include "common/angleutils.h"
#include "libGLESv2/angletypes.h" #include "libGLESv2/angletypes.h"
#include "libGLESv2/Error.h"
#include <map> #include <map>
...@@ -30,8 +31,8 @@ class Blit11 ...@@ -30,8 +31,8 @@ class Blit11
explicit Blit11(Renderer11 *renderer); explicit Blit11(Renderer11 *renderer);
~Blit11(); ~Blit11();
bool swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTargetView *dest, const gl::Extents &size, gl::Error swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTargetView *dest, const gl::Extents &size,
GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha); GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha);
bool copyTexture(ID3D11ShaderResourceView *source, const gl::Box &sourceArea, const gl::Extents &sourceSize, bool copyTexture(ID3D11ShaderResourceView *source, const gl::Box &sourceArea, const gl::Extents &sourceSize,
ID3D11RenderTargetView *dest, const gl::Box &destArea, const gl::Extents &destSize, ID3D11RenderTargetView *dest, const gl::Box &destArea, const gl::Extents &destSize,
......
...@@ -413,7 +413,7 @@ SwapChain *Renderer11::createSwapChain(HWND window, HANDLE shareHandle, GLenum b ...@@ -413,7 +413,7 @@ SwapChain *Renderer11::createSwapChain(HWND window, HANDLE shareHandle, GLenum b
return new rx::SwapChain11(this, window, shareHandle, backBufferFormat, depthBufferFormat); return new rx::SwapChain11(this, window, shareHandle, backBufferFormat, depthBufferFormat);
} }
void Renderer11::generateSwizzle(gl::Texture *texture) gl::Error Renderer11::generateSwizzle(gl::Texture *texture)
{ {
if (texture) if (texture)
{ {
...@@ -422,12 +422,18 @@ void Renderer11::generateSwizzle(gl::Texture *texture) ...@@ -422,12 +422,18 @@ void Renderer11::generateSwizzle(gl::Texture *texture)
{ {
TextureStorage11 *storage11 = TextureStorage11::makeTextureStorage11(texStorage); TextureStorage11 *storage11 = TextureStorage11::makeTextureStorage11(texStorage);
storage11->generateSwizzles(texture->getSamplerState().swizzleRed, gl::Error error = storage11->generateSwizzles(texture->getSamplerState().swizzleRed,
texture->getSamplerState().swizzleGreen, texture->getSamplerState().swizzleGreen,
texture->getSamplerState().swizzleBlue, texture->getSamplerState().swizzleBlue,
texture->getSamplerState().swizzleAlpha); texture->getSamplerState().swizzleAlpha);
if (error.isError())
{
return error;
}
} }
} }
return gl::Error(GL_NO_ERROR);
} }
void Renderer11::setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &samplerState) void Renderer11::setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &samplerState)
......
...@@ -59,7 +59,7 @@ class Renderer11 : public Renderer ...@@ -59,7 +59,7 @@ class Renderer11 : public Renderer
virtual SwapChain *createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat); virtual SwapChain *createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat);
virtual void generateSwizzle(gl::Texture *texture); virtual gl::Error generateSwizzle(gl::Texture *texture);
virtual void setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &sampler); virtual void setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &sampler);
virtual void setTexture(gl::SamplerType type, int index, gl::Texture *texture); virtual void setTexture(gl::SamplerType type, int index, gl::Texture *texture);
......
...@@ -240,7 +240,7 @@ ID3D11ShaderResourceView *TextureStorage11::getSRVLevel(int mipLevel) ...@@ -240,7 +240,7 @@ ID3D11ShaderResourceView *TextureStorage11::getSRVLevel(int mipLevel)
} }
} }
void TextureStorage11::generateSwizzles(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha) gl::Error TextureStorage11::generateSwizzles(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha)
{ {
SwizzleCacheValue swizzleTarget(swizzleRed, swizzleGreen, swizzleBlue, swizzleAlpha); SwizzleCacheValue swizzleTarget(swizzleRed, swizzleGreen, swizzleBlue, swizzleAlpha);
for (int level = 0; level < getLevelCount(); level++) for (int level = 0; level < getLevelCount(); level++)
...@@ -256,16 +256,17 @@ void TextureStorage11::generateSwizzles(GLenum swizzleRed, GLenum swizzleGreen, ...@@ -256,16 +256,17 @@ void TextureStorage11::generateSwizzles(GLenum swizzleRed, GLenum swizzleGreen,
Blit11 *blitter = mRenderer->getBlitter(); Blit11 *blitter = mRenderer->getBlitter();
if (blitter->swizzleTexture(sourceSRV, destRTV, size, swizzleRed, swizzleGreen, swizzleBlue, swizzleAlpha)) gl::Error error = blitter->swizzleTexture(sourceSRV, destRTV, size, swizzleRed, swizzleGreen, swizzleBlue, swizzleAlpha);
if (error.isError())
{ {
mSwizzleCache[level] = swizzleTarget; return error;
}
else
{
ERR("Failed to swizzle texture.");
} }
mSwizzleCache[level] = swizzleTarget;
} }
} }
return gl::Error(GL_NO_ERROR);
} }
void TextureStorage11::invalidateSwizzleCacheLevel(int mipLevel) void TextureStorage11::invalidateSwizzleCacheLevel(int mipLevel)
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#define LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_ #define LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_
#include "libGLESv2/Texture.h" #include "libGLESv2/Texture.h"
#include "libGLESv2/Error.h"
#include "libGLESv2/renderer/d3d/TextureStorage.h" #include "libGLESv2/renderer/d3d/TextureStorage.h"
#include <map> #include <map>
...@@ -52,7 +53,7 @@ class TextureStorage11 : public TextureStorage ...@@ -52,7 +53,7 @@ class TextureStorage11 : public TextureStorage
virtual int getLevelCount() const; virtual int getLevelCount() const;
UINT getSubresourceIndex(int mipLevel, int layerTarget) const; UINT getSubresourceIndex(int mipLevel, int layerTarget) const;
void generateSwizzles(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha); gl::Error generateSwizzles(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha);
void invalidateSwizzleCacheLevel(int mipLevel); void invalidateSwizzleCacheLevel(int mipLevel);
void invalidateSwizzleCache(); void invalidateSwizzleCache();
......
...@@ -636,10 +636,11 @@ bool Renderer9::fastCopyBufferToTexture(const gl::PixelUnpackState &unpack, unsi ...@@ -636,10 +636,11 @@ bool Renderer9::fastCopyBufferToTexture(const gl::PixelUnpackState &unpack, unsi
return false; return false;
} }
void Renderer9::generateSwizzle(gl::Texture *texture) gl::Error Renderer9::generateSwizzle(gl::Texture *texture)
{ {
// Swizzled textures are not available in ES2 or D3D9 // Swizzled textures are not available in ES2 or D3D9
UNREACHABLE(); UNREACHABLE();
return gl::Error(GL_INVALID_OPERATION);
} }
void Renderer9::setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &samplerState) void Renderer9::setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &samplerState)
......
...@@ -60,7 +60,7 @@ class Renderer9 : public Renderer ...@@ -60,7 +60,7 @@ class Renderer9 : public Renderer
IDirect3DPixelShader9 *createPixelShader(const DWORD *function, size_t length); IDirect3DPixelShader9 *createPixelShader(const DWORD *function, size_t length);
HRESULT createVertexBuffer(UINT Length, DWORD Usage, IDirect3DVertexBuffer9 **ppVertexBuffer); HRESULT createVertexBuffer(UINT Length, DWORD Usage, IDirect3DVertexBuffer9 **ppVertexBuffer);
HRESULT createIndexBuffer(UINT Length, DWORD Usage, D3DFORMAT Format, IDirect3DIndexBuffer9 **ppIndexBuffer); HRESULT createIndexBuffer(UINT Length, DWORD Usage, D3DFORMAT Format, IDirect3DIndexBuffer9 **ppIndexBuffer);
virtual void generateSwizzle(gl::Texture *texture); virtual gl::Error generateSwizzle(gl::Texture *texture);
virtual void setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &sampler); virtual void setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &sampler);
virtual void setTexture(gl::SamplerType type, int index, gl::Texture *texture); virtual void setTexture(gl::SamplerType type, int index, gl::Texture *texture);
......
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