diff options
author | Android Chromium Automerger <chromium-automerger@android> | 2014-09-22 19:34:46 +0000 |
---|---|---|
committer | Android Chromium Automerger <chromium-automerger@android> | 2014-09-22 19:34:46 +0000 |
commit | 2f9e7f86fa311f343f730235f11fb32a78464b02 (patch) | |
tree | 93b73cd9a15151afe8349ed63a852e48ddf49faf | |
parent | 9c01c4ae54854c432887c50ba13ff05a6e26fbd5 (diff) | |
parent | df647a2a354d5dc9affdd6a982fccb6b95d361b0 (diff) | |
download | angle-2f9e7f86fa311f343f730235f11fb32a78464b02.tar.gz |
Merge third_party/angle from https://chromium.googlesource.com/angle/angle.git at df647a2a354d5dc9affdd6a982fccb6b95d361b0
This commit was generated by merge_from_chromium.py.
Change-Id: I52baa35cda86ac16ec5e2ee0ab225188d2b7dacf
63 files changed, 1487 insertions, 1429 deletions
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp index eb71e71c..c467fa8b 100644 --- a/src/libGLESv2/Context.cpp +++ b/src/libGLESv2/Context.cpp @@ -43,6 +43,7 @@ Context::Context(int clientVersion, const gl::Context *shareContext, rx::Rendere ASSERT(robustAccess == false); // Unimplemented initCaps(clientVersion); + mState.initialize(mCaps, clientVersion); mClientVersion = clientVersion; @@ -64,16 +65,26 @@ Context::Context(int clientVersion, const gl::Context *shareContext, rx::Rendere // In order that access to these initial textures not be lost, they are treated as texture // objects all of whose names are 0. - mTexture2DZero.set(new Texture2D(mRenderer->createTexture(GL_TEXTURE_2D), 0)); - mTextureCubeMapZero.set(new TextureCubeMap(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), 0)); - mTexture3DZero.set(new Texture3D(mRenderer->createTexture(GL_TEXTURE_3D), 0)); - mTexture2DArrayZero.set(new Texture2DArray(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), 0)); + mZeroTextures[GL_TEXTURE_2D].set(new Texture2D(mRenderer->createTexture(GL_TEXTURE_2D), 0)); + bindTexture(GL_TEXTURE_2D, 0); + + mZeroTextures[GL_TEXTURE_CUBE_MAP].set(new TextureCubeMap(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), 0)); + bindTexture(GL_TEXTURE_CUBE_MAP, 0); + + if (mClientVersion >= 3) + { + // TODO: These could also be enabled via extension + mZeroTextures[GL_TEXTURE_3D].set(new Texture3D(mRenderer->createTexture(GL_TEXTURE_3D), 0)); + bindTexture(GL_TEXTURE_3D, 0); + + mZeroTextures[GL_TEXTURE_2D_ARRAY].set(new Texture2DArray(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), 0)); + bindTexture(GL_TEXTURE_2D_ARRAY, 0); + } bindVertexArray(0); bindArrayBuffer(0); bindElementArrayBuffer(0); - bindTextureCubeMap(0); - bindTexture2D(0); + bindReadFramebuffer(0); bindDrawFramebuffer(0); bindRenderbuffer(0); @@ -151,15 +162,17 @@ Context::~Context() deleteTransformFeedback(mTransformFeedbackMap.begin()->first); } - for (int type = 0; type < TEXTURE_TYPE_COUNT; type++) + for (TextureMap::iterator i = mIncompleteTextures.begin(); i != mIncompleteTextures.end(); i++) { - mIncompleteTextures[type].set(NULL); + i->second.set(NULL); } + mIncompleteTextures.clear(); - mTexture2DZero.set(NULL); - mTextureCubeMapZero.set(NULL); - mTexture3DZero.set(NULL); - mTexture2DArrayZero.set(NULL); + for (TextureMap::iterator i = mZeroTextures.begin(); i != mZeroTextures.end(); i++) + { + i->second.set(NULL); + } + mZeroTextures.clear(); mResourceManager->release(); } @@ -501,32 +514,11 @@ void Context::bindElementArrayBuffer(unsigned int buffer) mState.getVertexArray()->setElementArrayBuffer(getBuffer(buffer)); } -void Context::bindTexture2D(GLuint texture) -{ - mResourceManager->checkTextureAllocation(texture, TEXTURE_2D); - - mState.setSamplerTexture(TEXTURE_2D, getTexture(texture)); -} - -void Context::bindTextureCubeMap(GLuint texture) +void Context::bindTexture(GLenum target, GLuint texture) { - mResourceManager->checkTextureAllocation(texture, TEXTURE_CUBE); + mResourceManager->checkTextureAllocation(texture, target); - mState.setSamplerTexture(TEXTURE_CUBE, getTexture(texture)); -} - -void Context::bindTexture3D(GLuint texture) -{ - mResourceManager->checkTextureAllocation(texture, TEXTURE_3D); - - mState.setSamplerTexture(TEXTURE_3D, getTexture(texture)); -} - -void Context::bindTexture2DArray(GLuint texture) -{ - mResourceManager->checkTextureAllocation(texture, TEXTURE_2D_ARRAY); - - mState.setSamplerTexture(TEXTURE_2D_ARRAY, getTexture(texture)); + mState.setSamplerTexture(target, getTexture(texture)); } void Context::bindReadFramebuffer(GLuint framebuffer) @@ -569,7 +561,7 @@ void Context::bindVertexArray(GLuint vertexArray) void Context::bindSampler(GLuint textureUnit, GLuint sampler) { - ASSERT(textureUnit < IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS); // TODO: Update for backend-determined array size + ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits); mResourceManager->checkSamplerAllocation(sampler); mState.setSamplerBinding(textureUnit, getSampler(sampler)); @@ -824,36 +816,29 @@ Texture *Context::getTargetTexture(GLenum target) const Texture2D *Context::getTexture2D() const { - return static_cast<Texture2D*>(getSamplerTexture(mState.getActiveSampler(), TEXTURE_2D)); + return static_cast<Texture2D*>(getSamplerTexture(mState.getActiveSampler(), GL_TEXTURE_2D)); } TextureCubeMap *Context::getTextureCubeMap() const { - return static_cast<TextureCubeMap*>(getSamplerTexture(mState.getActiveSampler(), TEXTURE_CUBE)); + return static_cast<TextureCubeMap*>(getSamplerTexture(mState.getActiveSampler(), GL_TEXTURE_CUBE_MAP)); } Texture3D *Context::getTexture3D() const { - return static_cast<Texture3D*>(getSamplerTexture(mState.getActiveSampler(), TEXTURE_3D)); + return static_cast<Texture3D*>(getSamplerTexture(mState.getActiveSampler(), GL_TEXTURE_3D)); } Texture2DArray *Context::getTexture2DArray() const { - return static_cast<Texture2DArray*>(getSamplerTexture(mState.getActiveSampler(), TEXTURE_2D_ARRAY)); + return static_cast<Texture2DArray*>(getSamplerTexture(mState.getActiveSampler(), GL_TEXTURE_2D_ARRAY)); } -Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const +Texture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const { if (mState.getSamplerTextureId(sampler, type) == 0) { - switch (type) - { - default: UNREACHABLE(); - case TEXTURE_2D: return mTexture2DZero.get(); - case TEXTURE_CUBE: return mTextureCubeMapZero.get(); - case TEXTURE_3D: return mTexture3DZero.get(); - case TEXTURE_2D_ARRAY: return mTexture2DArrayZero.get(); - } + return mZeroTextures.at(type).get(); } else { @@ -1325,7 +1310,7 @@ bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned // Applies the render target surface, depth stencil surface, viewport rectangle and // scissor rectangle to the renderer -bool Context::applyRenderTarget(GLenum drawMode, bool ignoreViewport) +void Context::applyRenderTarget(GLenum drawMode, bool ignoreViewport) { Framebuffer *framebufferObject = mState.getDrawFramebuffer(); ASSERT(framebufferObject && framebufferObject->completeness() == GL_FRAMEBUFFER_COMPLETE); @@ -1334,15 +1319,10 @@ bool Context::applyRenderTarget(GLenum drawMode, bool ignoreViewport) float nearZ, farZ; mState.getDepthRange(&nearZ, &farZ); - if (!mRenderer->setViewport(mState.getViewport(), nearZ, farZ, drawMode, mState.getRasterizerState().frontFace, - ignoreViewport)) - { - return false; - } + mRenderer->setViewport(mState.getViewport(), nearZ, farZ, drawMode, mState.getRasterizerState().frontFace, + ignoreViewport); mRenderer->setScissorRectangle(mState.getScissor(), mState.isScissorTestEnabled()); - - return true; } // Applies the fixed-function state (culling, depth test, alpha blending, stenciling, etc) to the Direct3D 9 device @@ -1410,63 +1390,54 @@ void Context::applyShaders(ProgramBinary *programBinary, bool transformFeedbackA programBinary->applyUniforms(); } -size_t Context::getCurrentTexturesAndSamplerStates(ProgramBinary *programBinary, SamplerType type, Texture **outTextures, - TextureType *outTextureTypes, SamplerState *outSamplers) +void Context::generateSwizzles(ProgramBinary *programBinary, SamplerType type) { size_t samplerRange = programBinary->getUsedSamplerRange(type); + for (size_t i = 0; i < samplerRange; i++) { - outTextureTypes[i] = programBinary->getSamplerTextureType(type, i); - GLint textureUnit = programBinary->getSamplerMapping(type, i, getCaps()); // OpenGL texture image unit index + GLenum textureType = programBinary->getSamplerTextureType(type, i); + GLint textureUnit = programBinary->getSamplerMapping(type, i, getCaps()); if (textureUnit != -1) { - outTextures[i] = getSamplerTexture(textureUnit, outTextureTypes[i]); - outTextures[i]->getSamplerStateWithNativeOffset(&outSamplers[i]); - Sampler *samplerObject = mState.getSampler(textureUnit); - if (samplerObject) + Texture* texture = getSamplerTexture(textureUnit, textureType); + if (texture->getSamplerState().swizzleRequired()) { - samplerObject->getState(&outSamplers[i]); + mRenderer->generateSwizzle(texture); } } - else - { - outTextures[i] = NULL; - } } - - return samplerRange; } -void Context::generateSwizzles(Texture *textures[], size_t count) +void Context::generateSwizzles(ProgramBinary *programBinary) { - for (size_t i = 0; i < count; i++) - { - if (textures[i] && textures[i]->getSamplerState().swizzleRequired()) - { - mRenderer->generateSwizzle(textures[i]); - } - } + generateSwizzles(programBinary, SAMPLER_VERTEX); + generateSwizzles(programBinary, SAMPLER_PIXEL); } // For each Direct3D sampler of either the pixel or vertex stage, // looks up the corresponding OpenGL texture image unit and texture type, // and sets the texture and its addressing/filtering state (or NULL when inactive). -void Context::applyTextures(SamplerType shaderType, Texture *textures[], TextureType *textureTypes, SamplerState *samplers, - size_t textureCount, const FramebufferTextureSerialArray& framebufferSerials, - size_t framebufferSerialCount) +void Context::applyTextures(ProgramBinary *programBinary, SamplerType shaderType, + const FramebufferTextureSerialArray &framebufferSerials, size_t framebufferSerialCount) { - // Range of Direct3D samplers of given sampler type - size_t samplerCount = (shaderType == SAMPLER_PIXEL) ? mCaps.maxTextureImageUnits - : mCaps.maxVertexTextureImageUnits; - - for (size_t samplerIndex = 0; samplerIndex < textureCount; samplerIndex++) + size_t samplerRange = programBinary->getUsedSamplerRange(shaderType); + for (size_t samplerIndex = 0; samplerIndex < samplerRange; samplerIndex++) { - Texture *texture = textures[samplerIndex]; - const SamplerState &sampler = samplers[samplerIndex]; - TextureType textureType = textureTypes[samplerIndex]; - - if (texture) + GLenum textureType = programBinary->getSamplerTextureType(shaderType, samplerIndex); + GLint textureUnit = programBinary->getSamplerMapping(shaderType, samplerIndex, getCaps()); + if (textureUnit != -1) { + SamplerState sampler; + Texture* texture = getSamplerTexture(textureUnit, textureType); + texture->getSamplerStateWithNativeOffset(&sampler); + + Sampler *samplerObject = mState.getSampler(textureUnit); + if (samplerObject) + { + samplerObject->getState(&sampler); + } + // TODO: std::binary_search may become unavailable using older versions of GCC if (texture->isSamplerComplete(sampler, mTextureCaps, mExtensions, mClientVersion) && !std::binary_search(framebufferSerials.begin(), framebufferSerials.begin() + framebufferSerialCount, texture->getTextureSerial())) @@ -1476,22 +1447,36 @@ void Context::applyTextures(SamplerType shaderType, Texture *textures[], Texture } else { + // Texture is not sampler complete or it is in use by the framebuffer. Bind the incomplete texture. Texture *incompleteTexture = getIncompleteTexture(textureType); mRenderer->setTexture(shaderType, samplerIndex, incompleteTexture); } } else { + // No texture bound to this slot even though it is used by the shader, bind a NULL texture mRenderer->setTexture(shaderType, samplerIndex, NULL); } } - for (size_t samplerIndex = textureCount; samplerIndex < samplerCount; samplerIndex++) + // Set all the remaining textures to NULL + size_t samplerCount = (shaderType == SAMPLER_PIXEL) ? mCaps.maxTextureImageUnits + : mCaps.maxVertexTextureImageUnits; + for (size_t samplerIndex = samplerRange; samplerIndex < samplerCount; samplerIndex++) { mRenderer->setTexture(shaderType, samplerIndex, NULL); } } +void Context::applyTextures(ProgramBinary *programBinary) +{ + FramebufferTextureSerialArray framebufferSerials; + size_t framebufferSerialCount = getBoundFramebufferTextureSerials(&framebufferSerials); + + applyTextures(programBinary, SAMPLER_VERTEX, framebufferSerials, framebufferSerialCount); + applyTextures(programBinary, SAMPLER_PIXEL, framebufferSerials, framebufferSerialCount); +} + bool Context::applyUniformBuffers() { Program *programObject = getProgram(mState.getCurrentProgramId()); @@ -1561,10 +1546,7 @@ Error Context::clear(GLbitfield mask) ClearParameters clearParams = mState.getClearParameters(mask); - if (!applyRenderTarget(GL_TRIANGLES, true)) // Clips the clear to the scissor rectangle but not the viewport - { - return Error(GL_NO_ERROR); - } + applyRenderTarget(GL_TRIANGLES, true); // Clips the clear to the scissor rectangle but not the viewport return mRenderer->clear(clearParams, mState.getDrawFramebuffer()); } @@ -1595,10 +1577,7 @@ Error Context::clearBufferfv(GLenum buffer, int drawbuffer, const float *values) clearParams.depthClearValue = values[0]; } - if (!applyRenderTarget(GL_TRIANGLES, true)) // Clips the clear to the scissor rectangle but not the viewport - { - return Error(GL_NO_ERROR); - } + applyRenderTarget(GL_TRIANGLES, true); // Clips the clear to the scissor rectangle but not the viewport return mRenderer->clear(clearParams, mState.getDrawFramebuffer()); } @@ -1619,10 +1598,7 @@ Error Context::clearBufferuiv(GLenum buffer, int drawbuffer, const unsigned int clearParams.colorUIClearValue = ColorUI(values[0], values[1], values[2], values[3]); clearParams.colorClearType = GL_UNSIGNED_INT; - if (!applyRenderTarget(GL_TRIANGLES, true)) // Clips the clear to the scissor rectangle but not the viewport - { - return Error(GL_NO_ERROR); - } + applyRenderTarget(GL_TRIANGLES, true); // Clips the clear to the scissor rectangle but not the viewport return mRenderer->clear(clearParams, mState.getDrawFramebuffer()); } @@ -1653,10 +1629,7 @@ Error Context::clearBufferiv(GLenum buffer, int drawbuffer, const int *values) clearParams.stencilClearValue = values[1]; } - if (!applyRenderTarget(GL_TRIANGLES, true)) // Clips the clear to the scissor rectangle but not the viewport - { - return Error(GL_NO_ERROR); - } + applyRenderTarget(GL_TRIANGLES, true); // Clips the clear to the scissor rectangle but not the viewport return mRenderer->clear(clearParams, mState.getDrawFramebuffer()); } @@ -1675,10 +1648,7 @@ Error Context::clearBufferfi(GLenum buffer, int drawbuffer, float depth, int ste clearParams.clearStencil = true; clearParams.stencilClearValue = stencil; - if (!applyRenderTarget(GL_TRIANGLES, true)) // Clips the clear to the scissor rectangle but not the viewport - { - return Error(GL_NO_ERROR); - } + applyRenderTarget(GL_TRIANGLES, true); // Clips the clear to the scissor rectangle but not the viewport return mRenderer->clear(clearParams, mState.getDrawFramebuffer()); } @@ -1703,46 +1673,27 @@ void Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instan ProgramBinary *programBinary = mState.getCurrentProgramBinary(); programBinary->updateSamplerMapping(); - Texture *vsTextures[IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; - TextureType vsTextureTypes[IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; - SamplerState vsSamplers[IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; - size_t vsTextureCount = getCurrentTexturesAndSamplerStates(programBinary, SAMPLER_VERTEX, vsTextures, vsTextureTypes, vsSamplers); - - Texture *psTextures[MAX_TEXTURE_IMAGE_UNITS]; - TextureType psTextureTypes[MAX_TEXTURE_IMAGE_UNITS]; - SamplerState psSamplers[MAX_TEXTURE_IMAGE_UNITS]; - size_t psTextureCount = getCurrentTexturesAndSamplerStates(programBinary, SAMPLER_PIXEL, psTextures, psTextureTypes, psSamplers); - - generateSwizzles(vsTextures, vsTextureCount); - generateSwizzles(psTextures, psTextureCount); + generateSwizzles(programBinary); if (!mRenderer->applyPrimitiveType(mode, count)) { return; } - if (!applyRenderTarget(mode, false)) - { - return; - } - + applyRenderTarget(mode, false); applyState(mode); - GLenum err = mRenderer->applyVertexBuffer(programBinary, mState.getVertexArray()->getVertexAttributes(), mState.getVertexAttribCurrentValues(), first, count, instances); - if (err != GL_NO_ERROR) + Error error = mRenderer->applyVertexBuffer(programBinary, mState.getVertexArray()->getVertexAttributes(), mState.getVertexAttribCurrentValues(), first, count, instances); + if (error.isError()) { - return gl::error(err); + return gl::error(error.getCode()); } bool transformFeedbackActive = applyTransformFeedbackBuffers(); applyShaders(programBinary, transformFeedbackActive); - FramebufferTextureSerialArray frameBufferSerials; - size_t framebufferSerialCount = getBoundFramebufferTextureSerials(&frameBufferSerials); - - applyTextures(SAMPLER_VERTEX, vsTextures, vsTextureTypes, vsSamplers, vsTextureCount, frameBufferSerials, framebufferSerialCount); - applyTextures(SAMPLER_PIXEL, psTextures, psTextureTypes, psSamplers, psTextureCount, frameBufferSerials, framebufferSerialCount); + applyTextures(programBinary); if (!applyUniformBuffers()) { @@ -1769,29 +1720,14 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type, ProgramBinary *programBinary = mState.getCurrentProgramBinary(); programBinary->updateSamplerMapping(); - Texture *vsTextures[IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; - TextureType vsTextureTypes[IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; - SamplerState vsSamplers[IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; - size_t vsTextureCount = getCurrentTexturesAndSamplerStates(programBinary, SAMPLER_VERTEX, vsTextures, vsTextureTypes, vsSamplers); - - Texture *psTextures[MAX_TEXTURE_IMAGE_UNITS]; - TextureType psTextureTypes[MAX_TEXTURE_IMAGE_UNITS]; - SamplerState psSamplers[MAX_TEXTURE_IMAGE_UNITS]; - size_t psTextureCount = getCurrentTexturesAndSamplerStates(programBinary, SAMPLER_PIXEL, psTextures, psTextureTypes, psSamplers); - - generateSwizzles(vsTextures, vsTextureCount); - generateSwizzles(psTextures, psTextureCount); + generateSwizzles(programBinary); if (!mRenderer->applyPrimitiveType(mode, count)) { return; } - if (!applyRenderTarget(mode, false)) - { - return; - } - + applyRenderTarget(mode, false); applyState(mode); VertexArray *vao = mState.getVertexArray(); @@ -1804,12 +1740,12 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type, } GLsizei vertexCount = indexInfo.indexRange.length() + 1; - GLenum err = mRenderer->applyVertexBuffer(programBinary, vao->getVertexAttributes(), - mState.getVertexAttribCurrentValues(), - indexInfo.indexRange.start, vertexCount, instances); - if (err != GL_NO_ERROR) + error = mRenderer->applyVertexBuffer(programBinary, vao->getVertexAttributes(), + mState.getVertexAttribCurrentValues(), + indexInfo.indexRange.start, vertexCount, instances); + if (error.isError()) { - return gl::error(err); + return gl::error(error.getCode()); } bool transformFeedbackActive = applyTransformFeedbackBuffers(); @@ -1819,11 +1755,7 @@ void Context::drawElements(GLenum mode, GLsizei count, GLenum type, applyShaders(programBinary, transformFeedbackActive); - FramebufferTextureSerialArray frameBufferSerials; - size_t framebufferSerialCount = getBoundFramebufferTextureSerials(&frameBufferSerials); - - applyTextures(SAMPLER_VERTEX, vsTextures, vsTextureTypes, vsSamplers, vsTextureCount, frameBufferSerials, framebufferSerialCount); - applyTextures(SAMPLER_PIXEL, psTextures, psTextureTypes, psSamplers, psTextureCount, frameBufferSerials, framebufferSerialCount); + applyTextures(programBinary); if (!applyUniformBuffers()) { @@ -2009,22 +1941,21 @@ void Context::detachSampler(GLuint sampler) mState.detachSampler(sampler); } -Texture *Context::getIncompleteTexture(TextureType type) +Texture *Context::getIncompleteTexture(GLenum type) { - Texture *t = mIncompleteTextures[type].get(); - - if (t == NULL) + if (mIncompleteTextures.find(type) == mIncompleteTextures.end()) { const GLubyte color[] = { 0, 0, 0, 255 }; const PixelUnpackState incompleteUnpackState(1); + Texture* t = NULL; switch (type) { default: UNREACHABLE(); // default falls through to TEXTURE_2D - case TEXTURE_2D: + case GL_TEXTURE_2D: { Texture2D *incomplete2d = new Texture2D(mRenderer->createTexture(GL_TEXTURE_2D), Texture::INCOMPLETE_TEXTURE_ID); incomplete2d->setImage(0, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color); @@ -2032,7 +1963,7 @@ Texture *Context::getIncompleteTexture(TextureType type) } break; - case TEXTURE_CUBE: + case GL_TEXTURE_CUBE_MAP: { TextureCubeMap *incompleteCube = new TextureCubeMap(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), Texture::INCOMPLETE_TEXTURE_ID); @@ -2047,7 +1978,7 @@ Texture *Context::getIncompleteTexture(TextureType type) } break; - case TEXTURE_3D: + case GL_TEXTURE_3D: { Texture3D *incomplete3d = new Texture3D(mRenderer->createTexture(GL_TEXTURE_3D), Texture::INCOMPLETE_TEXTURE_ID); incomplete3d->setImage(0, 1, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color); @@ -2056,7 +1987,7 @@ Texture *Context::getIncompleteTexture(TextureType type) } break; - case TEXTURE_2D_ARRAY: + case GL_TEXTURE_2D_ARRAY: { Texture2DArray *incomplete2darray = new Texture2DArray(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), Texture::INCOMPLETE_TEXTURE_ID); incomplete2darray->setImage(0, 1, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color); @@ -2069,7 +2000,7 @@ Texture *Context::getIncompleteTexture(TextureType type) mIncompleteTextures[type].set(t); } - return t; + return mIncompleteTextures[type].get(); } bool Context::skipDraw(GLenum drawMode) @@ -2315,14 +2246,10 @@ void Context::initCaps(GLuint clientVersion) // Apply implementation limits mCaps.maxVertexAttributes = std::min<GLuint>(mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS); - mCaps.maxVertexTextureImageUnits = std::min<GLuint>(mCaps.maxVertexTextureImageUnits, IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS); mCaps.maxVertexUniformBlocks = std::min<GLuint>(mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS); mCaps.maxVertexOutputComponents = std::min<GLuint>(mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4); mCaps.maxFragmentInputComponents = std::min<GLuint>(mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4); - mCaps.maxTextureImageUnits = std::min<GLuint>(mCaps.maxTextureImageUnits, MAX_TEXTURE_IMAGE_UNITS); - - mCaps.maxCombinedTextureImageUnits = std::min<GLuint>(mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS); GLuint maxSamples = 0; mCaps.compressedTextureFormats.clear(); diff --git a/src/libGLESv2/Context.h b/src/libGLESv2/Context.h index 7c5494b4..bf886a83 100644 --- a/src/libGLESv2/Context.h +++ b/src/libGLESv2/Context.h @@ -115,10 +115,7 @@ class Context void bindArrayBuffer(GLuint buffer); void bindElementArrayBuffer(GLuint buffer); - void bindTexture2D(GLuint texture); - void bindTextureCubeMap(GLuint texture); - void bindTexture3D(GLuint texture); - void bindTexture2DArray(GLuint texture); + void bindTexture(GLenum target, GLuint texture); void bindReadFramebuffer(GLuint framebuffer); void bindDrawFramebuffer(GLuint framebuffer); void bindRenderbuffer(GLuint renderbuffer); @@ -170,7 +167,7 @@ class Context Texture3D *getTexture3D() const; Texture2DArray *getTexture2DArray() const; - Texture *getSamplerTexture(unsigned int sampler, TextureType type) const; + Texture *getSamplerTexture(unsigned int sampler, GLenum type) const; bool isSampler(GLuint samplerName) const; @@ -234,12 +231,12 @@ class Context // TODO: std::array may become unavailable using older versions of GCC typedef std::array<unsigned int, IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS> FramebufferTextureSerialArray; - bool applyRenderTarget(GLenum drawMode, bool ignoreViewport); + void applyRenderTarget(GLenum drawMode, bool ignoreViewport); void applyState(GLenum drawMode); void applyShaders(ProgramBinary *programBinary, bool transformFeedbackActive); - void applyTextures(SamplerType shaderType, Texture *textures[], TextureType *textureTypes, SamplerState *samplers, - size_t textureCount, const FramebufferTextureSerialArray& framebufferSerials, + void applyTextures(ProgramBinary *programBinary, SamplerType shaderType, const FramebufferTextureSerialArray &framebufferSerials, size_t framebufferSerialCount); + void applyTextures(ProgramBinary *programBinary); bool applyUniformBuffers(); bool applyTransformFeedbackBuffers(); void markTransformFeedbackUsage(); @@ -252,10 +249,10 @@ class Context void detachTransformFeedback(GLuint transformFeedback); void detachSampler(GLuint sampler); - void generateSwizzles(Texture *textures[], size_t count); - size_t getCurrentTexturesAndSamplerStates(ProgramBinary *programBinary, SamplerType type, Texture **outTextures, - TextureType *outTextureTypes, SamplerState *outSamplers); - Texture *getIncompleteTexture(TextureType type); + void generateSwizzles(ProgramBinary *programBinary, SamplerType type); + void generateSwizzles(ProgramBinary *programBinary); + + Texture *getIncompleteTexture(GLenum type); bool skipDraw(GLenum drawMode); @@ -276,10 +273,9 @@ class Context int mClientVersion; - BindingPointer<Texture2D> mTexture2DZero; - BindingPointer<TextureCubeMap> mTextureCubeMapZero; - BindingPointer<Texture3D> mTexture3DZero; - BindingPointer<Texture2DArray> mTexture2DArrayZero; + typedef std::map< GLenum, BindingPointer<Texture> > TextureMap; + TextureMap mZeroTextures; + TextureMap mIncompleteTextures; typedef std::unordered_map<GLuint, Framebuffer*> FramebufferMap; FramebufferMap mFramebufferMap; @@ -306,8 +302,6 @@ class Context std::string mExtensionString; std::vector<std::string> mExtensionStrings; - BindingPointer<Texture> mIncompleteTextures[TEXTURE_TYPE_COUNT]; - // Recorded errors typedef std::set<GLenum> ErrorSet; ErrorSet mErrors; diff --git a/src/libGLESv2/Framebuffer.cpp b/src/libGLESv2/Framebuffer.cpp index e82e34d6..5b21433f 100644 --- a/src/libGLESv2/Framebuffer.cpp +++ b/src/libGLESv2/Framebuffer.cpp @@ -29,8 +29,9 @@ RenderTarget *GetAttachmentRenderTarget(gl::FramebufferAttachment *attachment) gl::Texture *texture = attachment->getTexture(); ASSERT(texture); TextureD3D *textureD3D = TextureD3D::makeTextureD3D(texture->getImplementation()); - - return textureD3D->getRenderTarget(attachment->mipLevel(), attachment->layer()); + const gl::ImageIndex *index = attachment->getTextureImageIndex(); + ASSERT(index); + return textureD3D->getRenderTarget(*index); } gl::Renderbuffer *renderbuffer = attachment->getRenderbuffer(); @@ -48,7 +49,9 @@ unsigned int GetAttachmentSerial(gl::FramebufferAttachment *attachment) gl::Texture *texture = attachment->getTexture(); ASSERT(texture); TextureD3D *textureD3D = TextureD3D::makeTextureD3D(texture->getImplementation()); - return textureD3D->getRenderTargetSerial(attachment->mipLevel(), attachment->layer()); + const gl::ImageIndex *index = attachment->getTextureImageIndex(); + ASSERT(index); + return textureD3D->getRenderTargetSerial(*index); } gl::Renderbuffer *renderbuffer = attachment->getRenderbuffer(); diff --git a/src/libGLESv2/FramebufferAttachment.cpp b/src/libGLESv2/FramebufferAttachment.cpp index 7145e075..540ede1c 100644 --- a/src/libGLESv2/FramebufferAttachment.cpp +++ b/src/libGLESv2/FramebufferAttachment.cpp @@ -140,6 +140,11 @@ Texture *TextureAttachment::getTexture() return mTexture.get(); } +const ImageIndex *TextureAttachment::getTextureImageIndex() const +{ + return &mIndex; +} + Renderbuffer *TextureAttachment::getRenderbuffer() { UNREACHABLE(); @@ -211,6 +216,12 @@ Texture *RenderbufferAttachment::getTexture() return NULL; } +const ImageIndex *RenderbufferAttachment::getTextureImageIndex() const +{ + UNREACHABLE(); + return NULL; +} + Renderbuffer *RenderbufferAttachment::getRenderbuffer() { return mRenderbuffer.get(); diff --git a/src/libGLESv2/FramebufferAttachment.h b/src/libGLESv2/FramebufferAttachment.h index 8938540f..c18ef736 100644 --- a/src/libGLESv2/FramebufferAttachment.h +++ b/src/libGLESv2/FramebufferAttachment.h @@ -68,6 +68,7 @@ class FramebufferAttachment virtual GLint layer() const = 0; virtual Texture *getTexture() = 0; + virtual const ImageIndex *getTextureImageIndex() const = 0; virtual Renderbuffer *getRenderbuffer() = 0; private: @@ -95,6 +96,7 @@ class TextureAttachment : public FramebufferAttachment virtual GLint layer() const; virtual Texture *getTexture(); + virtual const ImageIndex *getTextureImageIndex() const; virtual Renderbuffer *getRenderbuffer(); private: @@ -123,6 +125,7 @@ class RenderbufferAttachment : public FramebufferAttachment virtual GLint layer() const; virtual Texture *getTexture(); + virtual const ImageIndex *getTextureImageIndex() const; virtual Renderbuffer *getRenderbuffer(); private: diff --git a/src/libGLESv2/ImageIndex.cpp b/src/libGLESv2/ImageIndex.cpp index 98067861..3522b997 100644 --- a/src/libGLESv2/ImageIndex.cpp +++ b/src/libGLESv2/ImageIndex.cpp @@ -29,7 +29,7 @@ ImageIndex &ImageIndex::operator=(const ImageIndex &other) ImageIndex ImageIndex::Make2D(GLint mipIndex) { - return ImageIndex(GL_TEXTURE_2D, mipIndex, 0); + return ImageIndex(GL_TEXTURE_2D, mipIndex, ENTIRE_LEVEL); } ImageIndex ImageIndex::MakeCube(GLenum target, GLint mipIndex) diff --git a/src/libGLESv2/ImageIndex.h b/src/libGLESv2/ImageIndex.h index 342a2934..9f2df880 100644 --- a/src/libGLESv2/ImageIndex.h +++ b/src/libGLESv2/ImageIndex.h @@ -23,10 +23,14 @@ struct ImageIndex ImageIndex(const ImageIndex &other); ImageIndex &operator=(const ImageIndex &other); + bool hasLayer() const { return layerIndex != ENTIRE_LEVEL; } + static ImageIndex Make2D(GLint mipIndex); static ImageIndex MakeCube(GLenum target, GLint mipIndex); static ImageIndex Make2DArray(GLint mipIndex, GLint layerIndex); - static ImageIndex Make3D(GLint mipIndex, GLint layerIndex = 0); + static ImageIndex Make3D(GLint mipIndex, GLint layerIndex = ENTIRE_LEVEL); + + static const GLint ENTIRE_LEVEL = static_cast<GLint>(-1); private: ImageIndex(GLenum typeIn, GLint mipIndexIn, GLint layerIndexIn); diff --git a/src/libGLESv2/ProgramBinary.cpp b/src/libGLESv2/ProgramBinary.cpp index 1cc55d25..405a73cc 100644 --- a/src/libGLESv2/ProgramBinary.cpp +++ b/src/libGLESv2/ProgramBinary.cpp @@ -37,7 +37,7 @@ namespace gl namespace { -TextureType GetTextureType(GLenum samplerType) +GLenum GetTextureType(GLenum samplerType) { switch (samplerType) { @@ -45,26 +45,26 @@ TextureType GetTextureType(GLenum samplerType) case GL_INT_SAMPLER_2D: case GL_UNSIGNED_INT_SAMPLER_2D: case GL_SAMPLER_2D_SHADOW: - return TEXTURE_2D; + return GL_TEXTURE_2D; case GL_SAMPLER_3D: case GL_INT_SAMPLER_3D: case GL_UNSIGNED_INT_SAMPLER_3D: - return TEXTURE_3D; + return GL_TEXTURE_3D; case GL_SAMPLER_CUBE: case GL_SAMPLER_CUBE_SHADOW: - return TEXTURE_CUBE; + return GL_TEXTURE_CUBE_MAP; case GL_INT_SAMPLER_CUBE: case GL_UNSIGNED_INT_SAMPLER_CUBE: - return TEXTURE_CUBE; + return GL_TEXTURE_CUBE_MAP; case GL_SAMPLER_2D_ARRAY: case GL_INT_SAMPLER_2D_ARRAY: case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: case GL_SAMPLER_2D_ARRAY_SHADOW: - return TEXTURE_2D_ARRAY; + return GL_TEXTURE_2D_ARRAY; default: UNREACHABLE(); } - return TEXTURE_2D; + return GL_TEXTURE_2D; } unsigned int ParseAndStripArrayIndex(std::string* name) @@ -207,16 +207,6 @@ ProgramBinary::ProgramBinary(rx::ProgramImpl *impl) { mSemanticIndex[index] = -1; } - - for (int index = 0; index < MAX_TEXTURE_IMAGE_UNITS; index++) - { - mSamplersPS[index].active = false; - } - - for (int index = 0; index < IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS; index++) - { - mSamplersVS[index].active = false; - } } ProgramBinary::~ProgramBinary() @@ -380,8 +370,6 @@ bool ProgramBinary::usesGeometryShader() const return usesPointSpriteEmulation(); } -// Returns the index of the texture image unit (0-19) corresponding to a Direct3D 9 sampler -// index (0-15 for the pixel shader and 0-3 for the vertex shader). GLint ProgramBinary::getSamplerMapping(SamplerType type, unsigned int samplerIndex, const Caps &caps) { GLint logicalTextureUnit = -1; @@ -389,17 +377,15 @@ GLint ProgramBinary::getSamplerMapping(SamplerType type, unsigned int samplerInd switch (type) { case SAMPLER_PIXEL: - ASSERT(samplerIndex < ArraySize(mSamplersPS)); - - if (mSamplersPS[samplerIndex].active) + ASSERT(samplerIndex < caps.maxTextureImageUnits); + if (samplerIndex < mSamplersPS.size() && mSamplersPS[samplerIndex].active) { logicalTextureUnit = mSamplersPS[samplerIndex].logicalTextureUnit; } break; case SAMPLER_VERTEX: - ASSERT(samplerIndex < ArraySize(mSamplersVS)); - - if (mSamplersVS[samplerIndex].active) + ASSERT(samplerIndex < caps.maxVertexTextureImageUnits); + if (samplerIndex < mSamplersVS.size() && mSamplersVS[samplerIndex].active) { logicalTextureUnit = mSamplersVS[samplerIndex].logicalTextureUnit; } @@ -417,22 +403,22 @@ GLint ProgramBinary::getSamplerMapping(SamplerType type, unsigned int samplerInd // Returns the texture type for a given Direct3D 9 sampler type and // index (0-15 for the pixel shader and 0-3 for the vertex shader). -TextureType ProgramBinary::getSamplerTextureType(SamplerType type, unsigned int samplerIndex) +GLenum ProgramBinary::getSamplerTextureType(SamplerType type, unsigned int samplerIndex) { switch (type) { case SAMPLER_PIXEL: - ASSERT(samplerIndex < ArraySize(mSamplersPS)); + ASSERT(samplerIndex < mSamplersPS.size()); ASSERT(mSamplersPS[samplerIndex].active); return mSamplersPS[samplerIndex].textureType; case SAMPLER_VERTEX: - ASSERT(samplerIndex < ArraySize(mSamplersVS)); + ASSERT(samplerIndex < mSamplersVS.size()); ASSERT(mSamplersVS[samplerIndex].active); return mSamplersVS[samplerIndex].textureType; default: UNREACHABLE(); } - return TEXTURE_2D; + return GL_TEXTURE_2D; } GLint ProgramBinary::getUniformLocation(std::string name) @@ -955,7 +941,7 @@ void ProgramBinary::updateSamplerMapping() { unsigned int samplerIndex = firstIndex + i; - if (samplerIndex < MAX_TEXTURE_IMAGE_UNITS) + if (samplerIndex < mSamplersPS.size()) { ASSERT(mSamplersPS[samplerIndex].active); mSamplersPS[samplerIndex].logicalTextureUnit = v[i][0]; @@ -971,7 +957,7 @@ void ProgramBinary::updateSamplerMapping() { unsigned int samplerIndex = firstIndex + i; - if (samplerIndex < IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS) + if (samplerIndex < mSamplersVS.size()) { ASSERT(mSamplersVS[samplerIndex].active); mSamplersVS[samplerIndex].logicalTextureUnit = v[i][0]; @@ -1142,18 +1128,23 @@ bool ProgramBinary::load(InfoLog &infoLog, GLenum binaryFormat, const void *bina initAttributesByLayout(); - for (unsigned int i = 0; i < MAX_TEXTURE_IMAGE_UNITS; ++i) + const unsigned int psSamplerCount = stream.readInt<unsigned int>(); + for (unsigned int i = 0; i < psSamplerCount; ++i) { - stream.readBool(&mSamplersPS[i].active); - stream.readInt(&mSamplersPS[i].logicalTextureUnit); - stream.readInt(&mSamplersPS[i].textureType); + Sampler sampler; + stream.readBool(&sampler.active); + stream.readInt(&sampler.logicalTextureUnit); + stream.readInt(&sampler.textureType); + mSamplersPS.push_back(sampler); } - - for (unsigned int i = 0; i < IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS; ++i) + const unsigned int vsSamplerCount = stream.readInt<unsigned int>(); + for (unsigned int i = 0; i < vsSamplerCount; ++i) { - stream.readBool(&mSamplersVS[i].active); - stream.readInt(&mSamplersVS[i].logicalTextureUnit); - stream.readInt(&mSamplersVS[i].textureType); + Sampler sampler; + stream.readBool(&sampler.active); + stream.readInt(&sampler.logicalTextureUnit); + stream.readInt(&sampler.textureType); + mSamplersVS.push_back(sampler); } stream.readInt(&mUsedVertexSamplerRange); @@ -1383,14 +1374,16 @@ bool ProgramBinary::save(GLenum *binaryFormat, void *binary, GLsizei bufSize, GL stream.writeInt(mSemanticIndex[i]); } - for (unsigned int i = 0; i < MAX_TEXTURE_IMAGE_UNITS; ++i) + stream.writeInt(mSamplersPS.size()); + for (unsigned int i = 0; i < mSamplersPS.size(); ++i) { stream.writeInt(mSamplersPS[i].active); stream.writeInt(mSamplersPS[i].logicalTextureUnit); stream.writeInt(mSamplersPS[i].textureType); } - for (unsigned int i = 0; i < IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS; ++i) + stream.writeInt(mSamplersVS.size()); + for (unsigned int i = 0; i < mSamplersVS.size(); ++i) { stream.writeInt(mSamplersVS[i].active); stream.writeInt(mSamplersVS[i].logicalTextureUnit); @@ -1591,6 +1584,9 @@ bool ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attributeBin reset(); + mSamplersPS.resize(caps.maxTextureImageUnits); + mSamplersVS.resize(caps.maxVertexTextureImageUnits); + mTransformFeedbackBufferMode = transformFeedbackBufferMode; rx::ShaderD3D *vertexShaderD3D = rx::ShaderD3D::makeShaderD3D(vertexShader->getImplementation()); @@ -1998,10 +1994,10 @@ bool ProgramBinary::indexSamplerUniform(const LinkedUniform &uniform, InfoLog &i if (uniform.vsRegisterIndex != GL_INVALID_INDEX) { if (!assignSamplers(uniform.vsRegisterIndex, uniform.type, uniform.arraySize, mSamplersVS, - &mUsedVertexSamplerRange, caps.maxVertexTextureImageUnits)) + &mUsedVertexSamplerRange)) { infoLog.append("Vertex shader sampler count exceeds the maximum vertex texture units (%d).", - caps.maxVertexTextureImageUnits); + mSamplersVS.size()); return false; } @@ -2017,10 +2013,10 @@ bool ProgramBinary::indexSamplerUniform(const LinkedUniform &uniform, InfoLog &i if (uniform.psRegisterIndex != GL_INVALID_INDEX) { if (!assignSamplers(uniform.psRegisterIndex, uniform.type, uniform.arraySize, mSamplersPS, - &mUsedPixelSamplerRange, caps.maxTextureImageUnits)) + &mUsedPixelSamplerRange)) { infoLog.append("Pixel shader sampler count exceeds MAX_TEXTURE_IMAGE_UNITS (%d).", - caps.maxTextureImageUnits); + mSamplersPS.size()); return false; } @@ -2062,20 +2058,20 @@ bool ProgramBinary::indexUniforms(InfoLog &infoLog, const Caps &caps) bool ProgramBinary::assignSamplers(unsigned int startSamplerIndex, GLenum samplerType, unsigned int samplerCount, - Sampler *outArray, - GLuint *usedRange, - unsigned int limit) + std::vector<Sampler> &outSamplers, + GLuint *outUsedRange) { unsigned int samplerIndex = startSamplerIndex; do { - if (samplerIndex < limit) + if (samplerIndex < outSamplers.size()) { - outArray[samplerIndex].active = true; - outArray[samplerIndex].textureType = GetTextureType(samplerType); - outArray[samplerIndex].logicalTextureUnit = 0; - *usedRange = std::max(samplerIndex + 1, *usedRange); + Sampler& sampler = outSamplers[samplerIndex]; + sampler.active = true; + sampler.textureType = GetTextureType(samplerType); + sampler.logicalTextureUnit = 0; + *outUsedRange = std::max(samplerIndex + 1, *outUsedRange); } else { @@ -2668,13 +2664,7 @@ bool ProgramBinary::validateSamplers(InfoLog *infoLog, const Caps &caps) // DrawArrays and DrawElements will issue the INVALID_OPERATION error. updateSamplerMapping(); - const unsigned int maxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits; - TextureType textureUnitType[IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS]; - - for (unsigned int i = 0; i < IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS; ++i) - { - textureUnitType[i] = TEXTURE_UNKNOWN; - } + std::vector<GLenum> textureUnitTypes(caps.maxCombinedTextureImageUnits, GL_NONE); for (unsigned int i = 0; i < mUsedPixelSamplerRange; ++i) { @@ -2682,19 +2672,19 @@ bool ProgramBinary::validateSamplers(InfoLog *infoLog, const Caps &caps) { unsigned int unit = mSamplersPS[i].logicalTextureUnit; - if (unit >= maxCombinedTextureImageUnits) + if (unit >= textureUnitTypes.size()) { if (infoLog) { - infoLog->append("Sampler uniform (%d) exceeds IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)", unit, maxCombinedTextureImageUnits); + infoLog->append("Sampler uniform (%d) exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)", unit, textureUnitTypes.size()); } return false; } - if (textureUnitType[unit] != TEXTURE_UNKNOWN) + if (textureUnitTypes[unit] != GL_NONE) { - if (mSamplersPS[i].textureType != textureUnitType[unit]) + if (mSamplersPS[i].textureType != textureUnitTypes[unit]) { if (infoLog) { @@ -2706,7 +2696,7 @@ bool ProgramBinary::validateSamplers(InfoLog *infoLog, const Caps &caps) } else { - textureUnitType[unit] = mSamplersPS[i].textureType; + textureUnitTypes[unit] = mSamplersPS[i].textureType; } } } @@ -2717,19 +2707,19 @@ bool ProgramBinary::validateSamplers(InfoLog *infoLog, const Caps &caps) { unsigned int unit = mSamplersVS[i].logicalTextureUnit; - if (unit >= maxCombinedTextureImageUnits) + if (unit >= textureUnitTypes.size()) { if (infoLog) { - infoLog->append("Sampler uniform (%d) exceeds IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)", unit, maxCombinedTextureImageUnits); + infoLog->append("Sampler uniform (%d) exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)", unit, textureUnitTypes.size()); } return false; } - if (textureUnitType[unit] != TEXTURE_UNKNOWN) + if (textureUnitTypes[unit] != GL_NONE) { - if (mSamplersVS[i].textureType != textureUnitType[unit]) + if (mSamplersVS[i].textureType != textureUnitTypes[unit]) { if (infoLog) { @@ -2741,7 +2731,7 @@ bool ProgramBinary::validateSamplers(InfoLog *infoLog, const Caps &caps) } else { - textureUnitType[unit] = mSamplersVS[i].textureType; + textureUnitTypes[unit] = mSamplersVS[i].textureType; } } } @@ -2749,7 +2739,7 @@ bool ProgramBinary::validateSamplers(InfoLog *infoLog, const Caps &caps) return true; } -ProgramBinary::Sampler::Sampler() : active(false), logicalTextureUnit(0), textureType(TEXTURE_2D) +ProgramBinary::Sampler::Sampler() : active(false), logicalTextureUnit(0), textureType(GL_TEXTURE_2D) { } @@ -2807,14 +2797,9 @@ void ProgramBinary::reset() mTransformFeedbackBufferMode = GL_NONE; mTransformFeedbackLinkedVaryings.clear(); - for (size_t i = 0; i < ArraySize(mSamplersPS); i++) - { - mSamplersPS[i] = Sampler(); - } - for (size_t i = 0; i < ArraySize(mSamplersVS); i++) - { - mSamplersVS[i] = Sampler(); - } + mSamplersPS.clear(); + mSamplersVS.clear(); + mUsedVertexSamplerRange = 0; mUsedPixelSamplerRange = 0; mUsesPointSize = false; diff --git a/src/libGLESv2/ProgramBinary.h b/src/libGLESv2/ProgramBinary.h index 2fe924bb..738d63f9 100644 --- a/src/libGLESv2/ProgramBinary.h +++ b/src/libGLESv2/ProgramBinary.h @@ -110,7 +110,7 @@ class ProgramBinary : public RefCountObject int getSemanticIndex(int attributeIndex); GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex, const Caps &caps); - TextureType getSamplerTextureType(SamplerType type, unsigned int samplerIndex); + GLenum getSamplerTextureType(SamplerType type, unsigned int samplerIndex); GLint getUsedSamplerRange(SamplerType type); bool usesPointSize() const; bool usesPointSpriteEmulation() const; @@ -205,7 +205,7 @@ class ProgramBinary : public RefCountObject bool active; GLint logicalTextureUnit; - TextureType textureType; + GLenum textureType; }; void reset(); @@ -227,7 +227,7 @@ class ProgramBinary : public RefCountObject bool indexSamplerUniform(const LinkedUniform &uniform, InfoLog &infoLog, const Caps &caps); bool indexUniforms(InfoLog &infoLog, const Caps &caps); static bool assignSamplers(unsigned int startSamplerIndex, GLenum samplerType, unsigned int samplerCount, - Sampler *outArray, GLuint *usedRange, unsigned int limit); + std::vector<Sampler> &outSamplers, GLuint *outUsedRange); bool areMatchingInterfaceBlocks(InfoLog &infoLog, const sh::InterfaceBlock &vertexInterfaceBlock, const sh::InterfaceBlock &fragmentInterfaceBlock); bool linkUniformBlocks(InfoLog &infoLog, const Shader &vertexShader, const Shader &fragmentShader, const Caps &caps); bool gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std::vector<LinkedVarying> &linkedVaryings, @@ -303,8 +303,8 @@ class ProgramBinary : public RefCountObject GLenum mTransformFeedbackBufferMode; std::vector<LinkedVarying> mTransformFeedbackLinkedVaryings; - Sampler mSamplersPS[MAX_TEXTURE_IMAGE_UNITS]; - Sampler mSamplersVS[IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; + std::vector<Sampler> mSamplersPS; + std::vector<Sampler> mSamplersVS; GLuint mUsedVertexSamplerRange; GLuint mUsedPixelSamplerRange; bool mUsesPointSize; diff --git a/src/libGLESv2/Renderbuffer.cpp b/src/libGLESv2/Renderbuffer.cpp index 1470d1e1..9406fce5 100644 --- a/src/libGLESv2/Renderbuffer.cpp +++ b/src/libGLESv2/Renderbuffer.cpp @@ -155,7 +155,7 @@ unsigned int RenderbufferStorage::getSerial() const return mSerial; } -unsigned int RenderbufferStorage::issueSerials(GLuint count) +unsigned int RenderbufferStorage::issueSerials(unsigned int count) { unsigned int firstSerial = mCurrentSerial; mCurrentSerial += count; diff --git a/src/libGLESv2/Renderbuffer.h b/src/libGLESv2/Renderbuffer.h index 579d9ef4..71bcb0e1 100644 --- a/src/libGLESv2/Renderbuffer.h +++ b/src/libGLESv2/Renderbuffer.h @@ -83,7 +83,7 @@ class RenderbufferStorage virtual bool isTexture() const; virtual unsigned int getTextureSerial() const; - static unsigned int issueSerials(GLuint count); + static unsigned int issueSerials(unsigned int count); protected: GLsizei mWidth; diff --git a/src/libGLESv2/ResourceManager.cpp b/src/libGLESv2/ResourceManager.cpp index eccc1399..9121de17 100644 --- a/src/libGLESv2/ResourceManager.cpp +++ b/src/libGLESv2/ResourceManager.cpp @@ -366,25 +366,25 @@ void ResourceManager::checkBufferAllocation(unsigned int buffer) } } -void ResourceManager::checkTextureAllocation(GLuint texture, TextureType type) +void ResourceManager::checkTextureAllocation(GLuint texture, GLenum type) { if (!getTexture(texture) && texture != 0) { Texture *textureObject; - if (type == TEXTURE_2D) + if (type == GL_TEXTURE_2D) { textureObject = new Texture2D(mRenderer->createTexture(GL_TEXTURE_2D), texture); } - else if (type == TEXTURE_CUBE) + else if (type == GL_TEXTURE_CUBE_MAP) { textureObject = new TextureCubeMap(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), texture); } - else if (type == TEXTURE_3D) + else if (type == GL_TEXTURE_3D) { textureObject = new Texture3D(mRenderer->createTexture(GL_TEXTURE_3D), texture); } - else if (type == TEXTURE_2D_ARRAY) + else if (type == GL_TEXTURE_2D_ARRAY) { textureObject = new Texture2DArray(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), texture); } diff --git a/src/libGLESv2/ResourceManager.h b/src/libGLESv2/ResourceManager.h index 7ef90d29..7d53bd48 100644 --- a/src/libGLESv2/ResourceManager.h +++ b/src/libGLESv2/ResourceManager.h @@ -65,11 +65,11 @@ class ResourceManager Renderbuffer *getRenderbuffer(GLuint handle); Sampler *getSampler(GLuint handle); FenceSync *getFenceSync(GLuint handle); - + void setRenderbuffer(GLuint handle, Renderbuffer *renderbuffer); void checkBufferAllocation(unsigned int buffer); - void checkTextureAllocation(GLuint texture, TextureType type); + void checkTextureAllocation(GLuint texture, GLenum type); void checkRenderbufferAllocation(GLuint renderbuffer); void checkSamplerAllocation(GLuint sampler); diff --git a/src/libGLESv2/State.cpp b/src/libGLESv2/State.cpp index 5497fa78..3c03b90e 100644 --- a/src/libGLESv2/State.cpp +++ b/src/libGLESv2/State.cpp @@ -9,6 +9,7 @@ #include "libGLESv2/State.h" #include "libGLESv2/Context.h" +#include "libGLESv2/Caps.h" #include "libGLESv2/VertexArray.h" #include "libGLESv2/Query.h" #include "libGLESv2/Framebuffer.h" @@ -18,8 +19,18 @@ namespace gl { + State::State() { +} + +State::~State() +{ + reset(); +} + +void State::initialize(const Caps& caps, GLuint clientVersion) +{ mContext = NULL; setClearColor(0.0f, 0.0f, 0.0f, 0.0f); @@ -65,7 +76,7 @@ State::State() mDepthStencil.stencilMask = -1; mDepthStencil.stencilWritemask = -1; mDepthStencil.stencilBackFunc = GL_ALWAYS; - mDepthStencil.stencilBackMask = - 1; + mDepthStencil.stencilBackMask = -1; mDepthStencil.stencilBackWritemask = -1; mDepthStencil.stencilFail = GL_KEEP; mDepthStencil.stencilPassDepthFail = GL_KEEP; @@ -97,18 +108,24 @@ State::State() mBlend.colorMaskBlue = true; mBlend.colorMaskAlpha = true; + mActiveSampler = 0; + const GLfloat defaultFloatValues[] = { 0.0f, 0.0f, 0.0f, 1.0f }; for (int attribIndex = 0; attribIndex < MAX_VERTEX_ATTRIBS; attribIndex++) { mVertexAttribCurrentValues[attribIndex].setFloatValues(defaultFloatValues); } - for (unsigned int textureUnit = 0; textureUnit < ArraySize(mSamplers); textureUnit++) + mSamplerTextures[GL_TEXTURE_2D].resize(caps.maxCombinedTextureImageUnits); + mSamplerTextures[GL_TEXTURE_CUBE_MAP].resize(caps.maxCombinedTextureImageUnits); + if (clientVersion >= 3) { - mSamplers[textureUnit].set(NULL); + // TODO: These could also be enabled via extension + mSamplerTextures[GL_TEXTURE_2D_ARRAY].resize(caps.maxCombinedTextureImageUnits); + mSamplerTextures[GL_TEXTURE_3D].resize(caps.maxCombinedTextureImageUnits); } - mActiveSampler = 0; + mSamplers.resize(caps.maxCombinedTextureImageUnits); mActiveQueries[GL_ANY_SAMPLES_PASSED].set(NULL); mActiveQueries[GL_ANY_SAMPLES_PASSED_CONSERVATIVE].set(NULL); @@ -121,15 +138,20 @@ State::State() mDrawFramebuffer = NULL; } -State::~State() +void State::reset() { - for (int type = 0; type < TEXTURE_TYPE_COUNT; type++) + for (TextureBindingMap::iterator bindingVec = mSamplerTextures.begin(); bindingVec != mSamplerTextures.end(); bindingVec++) { - for (int sampler = 0; sampler < IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++) + TextureBindingVector &textureVector = bindingVec->second; + for (size_t textureIdx = 0; textureIdx < textureVector.size(); textureIdx++) { - mSamplerTexture[type][sampler].set(NULL); + textureVector[textureIdx].set(NULL); } } + for (size_t samplerIdx = 0; samplerIdx < mSamplers.size(); samplerIdx++) + { + mSamplers[samplerIdx].set(NULL); + } const GLfloat defaultFloatValues[] = { 0.0f, 0.0f, 0.0f, 1.0f }; for (int attribIndex = 0; attribIndex < MAX_VERTEX_ATTRIBS; attribIndex++) @@ -583,26 +605,26 @@ unsigned int State::getActiveSampler() const return mActiveSampler; } -void State::setSamplerTexture(TextureType type, Texture *texture) +void State::setSamplerTexture(GLenum type, Texture *texture) { - mSamplerTexture[type][mActiveSampler].set(texture); + mSamplerTextures[type][mActiveSampler].set(texture); } -Texture *State::getSamplerTexture(unsigned int sampler, TextureType type) const +Texture *State::getSamplerTexture(unsigned int sampler, GLenum type) const { - GLuint texid = mSamplerTexture[type][sampler].id(); + const BindingPointer<Texture>& binding = mSamplerTextures.at(type)[sampler]; - if (texid == 0) // Special case: 0 refers to default textures held by Context + if (binding.id() == 0) // Special case: 0 refers to default textures held by Context { return NULL; } - return mSamplerTexture[type][sampler].get(); + return binding.get(); } -GLuint State::getSamplerTextureId(unsigned int sampler, TextureType type) const +GLuint State::getSamplerTextureId(unsigned int sampler, GLenum type) const { - return mSamplerTexture[type][sampler].id(); + return mSamplerTextures.at(type)[sampler].id(); } void State::detachTexture(GLuint texture) @@ -616,13 +638,15 @@ void State::detachTexture(GLuint texture) // If a texture object is deleted, it is as if all texture units which are bound to that texture object are // rebound to texture object zero - for (int type = 0; type < TEXTURE_TYPE_COUNT; type++) + for (TextureBindingMap::iterator bindingVec = mSamplerTextures.begin(); bindingVec != mSamplerTextures.end(); bindingVec++) { - for (int sampler = 0; sampler < IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++) + TextureBindingVector &textureVector = bindingVec->second; + for (size_t textureIdx = 0; textureIdx < textureVector.size(); textureIdx++) { - if (mSamplerTexture[type][sampler].id() == texture) + BindingPointer<Texture> &binding = textureVector[textureIdx]; + if (binding.id() == texture) { - mSamplerTexture[type][sampler].set(NULL); + binding.set(NULL); } } } @@ -650,7 +674,7 @@ void State::setSamplerBinding(GLuint textureUnit, Sampler *sampler) GLuint State::getSamplerId(GLuint textureUnit) const { - ASSERT(textureUnit < ArraySize(mSamplers)); + ASSERT(textureUnit < mSamplers.size()); return mSamplers[textureUnit].id(); } @@ -665,11 +689,12 @@ void State::detachSampler(GLuint sampler) // If a sampler object that is currently bound to one or more texture units is // deleted, it is as though BindSampler is called once for each texture unit to // which the sampler is bound, with unit set to the texture unit and sampler set to zero. - for (unsigned int textureUnit = 0; textureUnit < ArraySize(mSamplers); textureUnit++) + for (size_t textureUnit = 0; textureUnit < mSamplers.size(); textureUnit++) { - if (mSamplers[textureUnit].id() == sampler) + BindingPointer<Sampler> &samplerBinding = mSamplers[textureUnit]; + if (samplerBinding.id() == sampler) { - mSamplers[textureUnit].set(NULL); + samplerBinding.set(NULL); } } } @@ -1308,19 +1333,19 @@ void State::getIntegerv(GLenum pname, GLint *params) break; case GL_TEXTURE_BINDING_2D: ASSERT(mActiveSampler < mContext->getCaps().maxCombinedTextureImageUnits); - *params = mSamplerTexture[TEXTURE_2D][mActiveSampler].id(); + *params = mSamplerTextures.at(GL_TEXTURE_2D)[mActiveSampler].id(); break; case GL_TEXTURE_BINDING_CUBE_MAP: ASSERT(mActiveSampler < mContext->getCaps().maxCombinedTextureImageUnits); - *params = mSamplerTexture[TEXTURE_CUBE][mActiveSampler].id(); + *params = mSamplerTextures.at(GL_TEXTURE_CUBE_MAP)[mActiveSampler].id(); break; case GL_TEXTURE_BINDING_3D: ASSERT(mActiveSampler <mContext->getCaps().maxCombinedTextureImageUnits); - *params = mSamplerTexture[TEXTURE_3D][mActiveSampler].id(); + *params = mSamplerTextures.at(GL_TEXTURE_3D)[mActiveSampler].id(); break; case GL_TEXTURE_BINDING_2D_ARRAY: ASSERT(mActiveSampler < mContext->getCaps().maxCombinedTextureImageUnits); - *params = mSamplerTexture[TEXTURE_2D_ARRAY][mActiveSampler].id(); + *params = mSamplerTextures.at(GL_TEXTURE_2D_ARRAY)[mActiveSampler].id(); break; case GL_UNIFORM_BUFFER_BINDING: *params = mGenericUniformBuffer.id(); diff --git a/src/libGLESv2/State.h b/src/libGLESv2/State.h index d3b3edc5..5f043313 100644 --- a/src/libGLESv2/State.h +++ b/src/libGLESv2/State.h @@ -24,6 +24,7 @@ namespace gl class Query; class VertexArray; class Context; +struct Caps; class State { @@ -31,6 +32,9 @@ class State State(); ~State(); + void initialize(const Caps& caps, GLuint clientVersion); + void reset(); + void setContext(Context *context) { mContext = context; } // State chunk getters @@ -126,9 +130,9 @@ class State // Texture binding & active texture unit manipulation void setActiveSampler(unsigned int active); unsigned int getActiveSampler() const; - void setSamplerTexture(TextureType type, Texture *texture); - Texture *getSamplerTexture(unsigned int sampler, TextureType type) const; - GLuint getSamplerTextureId(unsigned int sampler, TextureType type) const; + void setSamplerTexture(GLenum type, Texture *texture); + Texture *getSamplerTexture(unsigned int sampler, GLenum type) const; + GLuint getSamplerTextureId(unsigned int sampler, GLenum type) const; void detachTexture(GLuint texture); // Sampler object binding manipulation @@ -272,7 +276,6 @@ class State float mNearZ; float mFarZ; - unsigned int mActiveSampler; // Active texture unit selector - GL_TEXTURE0 BindingPointer<Buffer> mArrayBuffer; Framebuffer *mReadFramebuffer; Framebuffer *mDrawFramebuffer; @@ -283,8 +286,15 @@ class State VertexAttribCurrentValueData mVertexAttribCurrentValues[MAX_VERTEX_ATTRIBS]; // From glVertexAttrib VertexArray *mVertexArray; - BindingPointer<Texture> mSamplerTexture[TEXTURE_TYPE_COUNT][IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS]; - BindingPointer<Sampler> mSamplers[IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS]; + // Texture and sampler bindings + size_t mActiveSampler; // Active texture unit selector - GL_TEXTURE0 + + typedef std::vector< BindingPointer<Texture> > TextureBindingVector; + typedef std::map<GLenum, TextureBindingVector> TextureBindingMap; + TextureBindingMap mSamplerTextures; + + typedef std::vector< BindingPointer<Sampler> > SamplerBindingVector; + SamplerBindingVector mSamplers; typedef std::map< GLenum, BindingPointer<Query> > ActiveQueryMap; ActiveQueryMap mActiveQueries; diff --git a/src/libGLESv2/Texture.cpp b/src/libGLESv2/Texture.cpp index 826002df..3ec492de 100644 --- a/src/libGLESv2/Texture.cpp +++ b/src/libGLESv2/Texture.cpp @@ -77,7 +77,7 @@ void Texture::getSamplerStateWithNativeOffset(SamplerState *sampler) *sampler = mSamplerState; // Offset the effective base level by the texture storage's top level - rx::TextureStorageInterface *texture = getNativeTexture(); + rx::TextureStorage *texture = getNativeTexture(); int topLevel = texture ? texture->getTopLevel() : 0; sampler->baseLevel = topLevel + mSamplerState.baseLevel; } @@ -138,7 +138,7 @@ GLenum Texture::getActualFormat(const ImageIndex &index) const return image->getActualFormat(); } -rx::TextureStorageInterface *Texture::getNativeTexture() +rx::TextureStorage *Texture::getNativeTexture() { return getImplementation()->getNativeTexture(); } @@ -155,7 +155,7 @@ void Texture::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoff unsigned int Texture::getTextureSerial() { - rx::TextureStorageInterface *texture = getNativeTexture(); + rx::TextureStorage *texture = getNativeTexture(); return texture ? texture->getTextureSerial() : 0; } @@ -166,7 +166,7 @@ bool Texture::isImmutable() const int Texture::immutableLevelCount() { - return (mImmutable ? getNativeTexture()->getStorageInstance()->getLevelCount() : 0); + return (mImmutable ? getNativeTexture()->getLevelCount() : 0); } int Texture::mipLevels() const diff --git a/src/libGLESv2/Texture.h b/src/libGLESv2/Texture.h index 94dd3bc9..ca5686fd 100644 --- a/src/libGLESv2/Texture.h +++ b/src/libGLESv2/Texture.h @@ -69,7 +69,7 @@ class Texture : public RefCountObject virtual bool isSamplerComplete(const SamplerState &samplerState, const TextureCapsMap &textureCaps, const Extensions &extensions, int clientVersion) const = 0; - rx::TextureStorageInterface *getNativeTexture(); + rx::TextureStorage *getNativeTexture(); virtual void generateMipmaps(); virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); diff --git a/src/libGLESv2/angletypes.h b/src/libGLESv2/angletypes.h index 79ad810e..922053e9 100644 --- a/src/libGLESv2/angletypes.h +++ b/src/libGLESv2/angletypes.h @@ -19,17 +19,6 @@ class ProgramBinary; struct VertexAttribute; struct VertexAttribCurrentValueData; -enum TextureType -{ - TEXTURE_2D, - TEXTURE_CUBE, - TEXTURE_3D, - TEXTURE_2D_ARRAY, - - TEXTURE_TYPE_COUNT, - TEXTURE_UNKNOWN -}; - enum SamplerType { SAMPLER_PIXEL, diff --git a/src/libGLESv2/constants.h b/src/libGLESv2/constants.h index c87f92d4..69c4823f 100644 --- a/src/libGLESv2/constants.h +++ b/src/libGLESv2/constants.h @@ -15,12 +15,8 @@ namespace gl enum { MAX_VERTEX_ATTRIBS = 16, - MAX_TEXTURE_IMAGE_UNITS = 16, // Implementation upper limits, real maximums depend on the hardware - IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 16, - IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS = MAX_TEXTURE_IMAGE_UNITS + IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS, - IMPLEMENTATION_MAX_VARYING_VECTORS = 32, IMPLEMENTATION_MAX_DRAW_BUFFERS = 8, IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS = IMPLEMENTATION_MAX_DRAW_BUFFERS + 2, // 2 extra for depth and/or stencil buffers diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp index 821226bf..a62e163f 100644 --- a/src/libGLESv2/libGLESv2.cpp +++ b/src/libGLESv2/libGLESv2.cpp @@ -265,35 +265,24 @@ void __stdcall glBindTexture(GLenum target, GLuint texture) switch (target) { case GL_TEXTURE_2D: - context->bindTexture2D(texture); - return; - case GL_TEXTURE_CUBE_MAP: - context->bindTextureCubeMap(texture); - return; + break; case GL_TEXTURE_3D: - if (context->getClientVersion() < 3) - { - context->recordError(gl::Error(GL_INVALID_ENUM)); - return; - } - context->bindTexture3D(texture); - return; - case GL_TEXTURE_2D_ARRAY: if (context->getClientVersion() < 3) { context->recordError(gl::Error(GL_INVALID_ENUM)); return; } - context->bindTexture2DArray(texture); - return; + break; default: context->recordError(gl::Error(GL_INVALID_ENUM)); return; } + + context->bindTexture(target, texture); } } diff --git a/src/libGLESv2/renderer/Renderer.h b/src/libGLESv2/renderer/Renderer.h index 2d45cdbf..f104a951 100644 --- a/src/libGLESv2/renderer/Renderer.h +++ b/src/libGLESv2/renderer/Renderer.h @@ -44,10 +44,7 @@ struct VertexAttribCurrentValueData; namespace rx { -class TextureStorageInterface2D; -class TextureStorageInterfaceCube; -class TextureStorageInterface3D; -class TextureStorageInterface2DArray; +class TextureStorage; class VertexBuffer; class IndexBuffer; class QueryImpl; @@ -125,7 +122,7 @@ class Renderer int stencilBackRef, bool frontFaceCCW) = 0; virtual void setScissorRectangle(const gl::Rectangle &scissor, bool enabled) = 0; - virtual bool setViewport(const gl::Rectangle &viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace, + virtual void setViewport(const gl::Rectangle &viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace, bool ignoreViewport) = 0; virtual bool applyRenderTarget(gl::Framebuffer *frameBuffer) = 0; @@ -133,8 +130,8 @@ class Renderer bool rasterizerDiscard, bool transformFeedbackActive) = 0; virtual void applyUniforms(const gl::ProgramBinary &programBinary) = 0; virtual bool applyPrimitiveType(GLenum primitiveType, GLsizei elementCount) = 0; - virtual GLenum applyVertexBuffer(gl::ProgramBinary *programBinary, const gl::VertexAttribute vertexAttributes[], const gl::VertexAttribCurrentValueData currentValues[], - GLint first, GLsizei count, GLsizei instances) = 0; + virtual gl::Error applyVertexBuffer(gl::ProgramBinary *programBinary, const gl::VertexAttribute vertexAttributes[], const gl::VertexAttribCurrentValueData currentValues[], + GLint first, GLsizei count, GLsizei instances) = 0; virtual gl::Error applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo) = 0; virtual void applyTransformFeedbackBuffers(gl::Buffer *transformFeedbackBuffers[], GLintptr offsets[]) = 0; @@ -173,19 +170,19 @@ class Renderer virtual int getMaxSwapInterval() const = 0; // Pixel operations - virtual bool copyToRenderTarget(TextureStorageInterface2D *dest, TextureStorageInterface2D *source) = 0; - virtual bool copyToRenderTarget(TextureStorageInterfaceCube *dest, TextureStorageInterfaceCube *source) = 0; - virtual bool copyToRenderTarget(TextureStorageInterface3D *dest, TextureStorageInterface3D *source) = 0; - virtual bool copyToRenderTarget(TextureStorageInterface2DArray *dest, TextureStorageInterface2DArray *source) = 0; - - virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, TextureStorageInterface2D *storage, GLint level) = 0; - virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, TextureStorageInterfaceCube *storage, GLenum target, GLint level) = 0; - virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, GLint zOffset, TextureStorageInterface3D *storage, GLint level) = 0; - virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, GLint zOffset, TextureStorageInterface2DArray *storage, GLint level) = 0; + virtual bool copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source) = 0; + virtual bool copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source) = 0; + virtual bool copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source) = 0; + virtual bool copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source) = 0; + + virtual bool copyImage2D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level) = 0; + virtual bool copyImageCube(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, TextureStorage *storage, GLenum target, GLint level) = 0; + virtual bool copyImage3D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, GLint zOffset, TextureStorage *storage, GLint level) = 0; + virtual bool copyImage2DArray(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, GLint zOffset, TextureStorage *storage, GLint level) = 0; virtual bool blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget, const gl::Rectangle &drawRect, const gl::Rectangle *scissor, bool blitRenderTarget, bool blitDepth, bool blitStencil, GLenum filter) = 0; diff --git a/src/libGLESv2/renderer/TextureImpl.h b/src/libGLESv2/renderer/TextureImpl.h index da561bdc..e3cc50d6 100644 --- a/src/libGLESv2/renderer/TextureImpl.h +++ b/src/libGLESv2/renderer/TextureImpl.h @@ -32,7 +32,7 @@ namespace rx class Image; class Renderer; -class TextureStorageInterface; +class TextureStorage; class TextureImpl { @@ -42,7 +42,7 @@ class TextureImpl // TODO: If this methods could go away that would be ideal; // TextureStorage should only be necessary for the D3D backend, and as such // higher level code should not rely on it. - virtual TextureStorageInterface *getNativeTexture() = 0; + virtual TextureStorage *getNativeTexture() = 0; // Deprecated in favour of the ImageIndex method virtual Image *getImage(int level, int layer) const = 0; diff --git a/src/libGLESv2/renderer/d3d/ImageD3D.h b/src/libGLESv2/renderer/d3d/ImageD3D.h index 242ce5af..60a6ffdf 100644 --- a/src/libGLESv2/renderer/d3d/ImageD3D.h +++ b/src/libGLESv2/renderer/d3d/ImageD3D.h @@ -21,10 +21,7 @@ class Framebuffer; namespace rx { -class TextureStorageInterface2D; -class TextureStorageInterfaceCube; -class TextureStorageInterface3D; -class TextureStorageInterface2DArray; +class TextureStorage; class ImageD3D : public Image { @@ -36,14 +33,14 @@ class ImageD3D : public Image virtual bool isDirty() const = 0; - virtual void setManagedSurface(TextureStorageInterface2D *storage, int level) {}; - virtual void setManagedSurface(TextureStorageInterfaceCube *storage, int face, int level) {}; - virtual void setManagedSurface(TextureStorageInterface3D *storage, int level) {}; - virtual void setManagedSurface(TextureStorageInterface2DArray *storage, int layer, int level) {}; - virtual bool copyToStorage(TextureStorageInterface2D *storage, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height) = 0; - virtual bool copyToStorage(TextureStorageInterfaceCube *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height) = 0; - virtual bool copyToStorage(TextureStorageInterface3D *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth) = 0; - virtual bool copyToStorage(TextureStorageInterface2DArray *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height) = 0; + virtual void setManagedSurface2D(TextureStorage *storage, int level) {}; + virtual void setManagedSurfaceCube(TextureStorage *storage, int face, int level) {}; + virtual void setManagedSurface3D(TextureStorage *storage, int level) {}; + virtual void setManagedSurface2DArray(TextureStorage *storage, int layer, int level) {}; + virtual bool copyToStorage2D(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height) = 0; + virtual bool copyToStorageCube(TextureStorage *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height) = 0; + virtual bool copyToStorage3D(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth) = 0; + virtual bool copyToStorage2DArray(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height) = 0; private: DISALLOW_COPY_AND_ASSIGN(ImageD3D); diff --git a/src/libGLESv2/renderer/d3d/MemoryBuffer.cpp b/src/libGLESv2/renderer/d3d/MemoryBuffer.cpp index 301bbe8d..2b5b09a3 100644 --- a/src/libGLESv2/renderer/d3d/MemoryBuffer.cpp +++ b/src/libGLESv2/renderer/d3d/MemoryBuffer.cpp @@ -5,6 +5,7 @@ // #include "libGLESv2/renderer/d3d/MemoryBuffer.h" +#include "common/debug.h" #include <algorithm> #include <cstdlib> @@ -66,6 +67,7 @@ const uint8_t *MemoryBuffer::data() const uint8_t *MemoryBuffer::data() { + ASSERT(mData); return mData; } diff --git a/src/libGLESv2/renderer/d3d/MemoryBuffer.h b/src/libGLESv2/renderer/d3d/MemoryBuffer.h index 2484c074..c65f79fe 100644 --- a/src/libGLESv2/renderer/d3d/MemoryBuffer.h +++ b/src/libGLESv2/renderer/d3d/MemoryBuffer.h @@ -21,6 +21,7 @@ class MemoryBuffer bool resize(size_t size); size_t size() const; + bool empty() const { return mSize == 0; } const uint8_t *data() const; uint8_t *data(); diff --git a/src/libGLESv2/renderer/d3d/TextureD3D.cpp b/src/libGLESv2/renderer/d3d/TextureD3D.cpp index 06803eaf..2650913b 100644 --- a/src/libGLESv2/renderer/d3d/TextureD3D.cpp +++ b/src/libGLESv2/renderer/d3d/TextureD3D.cpp @@ -49,12 +49,12 @@ TextureD3D *TextureD3D::makeTextureD3D(TextureImpl *texture) return static_cast<TextureD3D*>(texture); } -TextureStorageInterface *TextureD3D::getNativeTexture() +TextureStorage *TextureD3D::getNativeTexture() { // ensure the underlying texture is created initializeStorage(false); - TextureStorageInterface *storage = getBaseLevelStorage(); + TextureStorage *storage = getBaseLevelStorage(); if (storage) { updateStorage(); @@ -244,7 +244,7 @@ Image *TextureD3D_2D::getImage(int level, int layer) const Image *TextureD3D_2D::getImage(const gl::ImageIndex &index) const { ASSERT(index.mipIndex < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(index.layerIndex == 0); + ASSERT(!index.hasLayer()); ASSERT(index.type == GL_TEXTURE_2D); return mImageArray[index.mipIndex]; } @@ -305,8 +305,10 @@ void TextureD3D_2D::setImage(GLenum target, GLint level, GLsizei width, GLsizei // Attempt a fast gpu copy of the pixel data to the surface if (isFastUnpackable(unpack, sizedInternalFormat) && isLevelComplete(level)) { + gl::ImageIndex index = gl::ImageIndex::Make2D(level); + // Will try to create RT storage if it does not exist - RenderTarget *destRenderTarget = getRenderTarget(level, 0); + RenderTarget *destRenderTarget = getRenderTarget(index); gl::Box destArea(0, 0, 0, getWidth(level), getHeight(level), 1); if (destRenderTarget && fastUnpackPixels(unpack, pixels, destArea, sizedInternalFormat, type, destRenderTarget)) @@ -340,9 +342,10 @@ void TextureD3D_2D::subImage(GLenum target, GLint level, GLint xoffset, GLint yo bool fastUnpacked = false; + gl::ImageIndex index = gl::ImageIndex::Make2D(level); if (isFastUnpackable(unpack, getInternalFormat(level)) && isLevelComplete(level)) { - RenderTarget *renderTarget = getRenderTarget(level, 0); + RenderTarget *renderTarget = getRenderTarget(index); gl::Box destArea(xoffset, yoffset, 0, width, height, 1); if (renderTarget && fastUnpackPixels(unpack, pixels, destArea, getInternalFormat(level), type, renderTarget)) @@ -354,7 +357,6 @@ void TextureD3D_2D::subImage(GLenum target, GLint level, GLint xoffset, GLint yo } } - gl::ImageIndex index = gl::ImageIndex::Make2D(level); if (!fastUnpacked && TextureD3D::subImage(xoffset, yoffset, 0, width, height, 1, format, type, unpack, pixels, index)) { commitRect(level, xoffset, yoffset, width, height); @@ -396,7 +398,7 @@ void TextureD3D_2D::copyImage(GLenum target, GLint level, GLenum format, GLint x sourceRect.y = y; sourceRect.height = height; - mRenderer->copyImage(source, sourceRect, format, 0, 0, mTexStorage, level); + mRenderer->copyImage2D(source, sourceRect, format, 0, 0, mTexStorage, level); } } } @@ -428,9 +430,9 @@ void TextureD3D_2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLin sourceRect.y = y; sourceRect.height = height; - mRenderer->copyImage(source, sourceRect, - gl::GetInternalFormatInfo(getBaseLevelInternalFormat()).format, - xoffset, yoffset, mTexStorage, level); + mRenderer->copyImage2D(source, sourceRect, + gl::GetInternalFormatInfo(getBaseLevelInternalFormat()).format, + xoffset, yoffset, mTexStorage, level); } } } @@ -453,7 +455,9 @@ void TextureD3D_2D::storage(GLenum target, GLsizei levels, GLenum internalformat mImmutable = true; - setCompleteTexStorage(new TextureStorageInterface2D(mRenderer, internalformat, IsRenderTargetUsage(mUsage), width, height, levels)); + bool renderTarget = IsRenderTargetUsage(mUsage); + TextureStorage *storage = mRenderer->createTextureStorage2D(internalformat, renderTarget, width, height, levels); + setCompleteTexStorage(storage); } void TextureD3D_2D::bindTexImage(egl::Surface *surface) @@ -466,7 +470,8 @@ void TextureD3D_2D::bindTexImage(egl::Surface *surface) { SafeDelete(mTexStorage); } - mTexStorage = new TextureStorageInterface2D(mRenderer, surface->getSwapChain()); + + mTexStorage = mRenderer->createTextureStorage2D(surface->getSwapChain()); mDirtyImages = true; } @@ -497,10 +502,9 @@ void TextureD3D_2D::generateMipmaps() if (mTexStorage && mTexStorage->isRenderTarget()) { + mTexStorage->generateMipmaps(); for (int level = 1; level < levelCount; level++) { - mTexStorage->generateMipmap(level); - mImageArray[level]->markClean(); } } @@ -513,15 +517,15 @@ void TextureD3D_2D::generateMipmaps() } } -unsigned int TextureD3D_2D::getRenderTargetSerial(GLint level, GLint layer) +unsigned int TextureD3D_2D::getRenderTargetSerial(const gl::ImageIndex &index) { - ASSERT(layer == 0); - return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(level) : 0); + ASSERT(!index.hasLayer()); + return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(index) : 0); } -RenderTarget *TextureD3D_2D::getRenderTarget(GLint level, GLint layer) +RenderTarget *TextureD3D_2D::getRenderTarget(const gl::ImageIndex &index) { - ASSERT(layer == 0); + ASSERT(!index.hasLayer()); // ensure the underlying texture is created if (!ensureRenderTarget()) @@ -529,8 +533,8 @@ RenderTarget *TextureD3D_2D::getRenderTarget(GLint level, GLint layer) return NULL; } - updateStorageLevel(level); - return mTexStorage->getRenderTarget(level); + updateStorageLevel(index.mipIndex); + return mTexStorage->getRenderTarget(index); } bool TextureD3D_2D::isValidLevel(int level) const @@ -606,20 +610,21 @@ void TextureD3D_2D::initializeStorage(bool renderTarget) updateStorage(); } -TextureStorageInterface2D *TextureD3D_2D::createCompleteStorage(bool renderTarget) const +TextureStorage *TextureD3D_2D::createCompleteStorage(bool renderTarget) const { GLsizei width = getBaseLevelWidth(); GLsizei height = getBaseLevelHeight(); + GLenum internalFormat = getBaseLevelInternalFormat(); ASSERT(width > 0 && height > 0); // use existing storage level count, when previously specified by TexStorage*D GLint levels = (mTexStorage ? mTexStorage->getLevelCount() : creationLevels(width, height, 1)); - return new TextureStorageInterface2D(mRenderer, getBaseLevelInternalFormat(), renderTarget, width, height, levels); + return mRenderer->createTextureStorage2D(internalFormat, renderTarget, width, height, levels); } -void TextureD3D_2D::setCompleteTexStorage(TextureStorageInterface2D *newCompleteTexStorage) +void TextureD3D_2D::setCompleteTexStorage(TextureStorage *newCompleteTexStorage) { SafeDelete(mTexStorage); mTexStorage = newCompleteTexStorage; @@ -628,7 +633,7 @@ void TextureD3D_2D::setCompleteTexStorage(TextureStorageInterface2D *newComplete { for (int level = 0; level < mTexStorage->getLevelCount(); level++) { - mImageArray[level]->setManagedSurface(mTexStorage, level); + mImageArray[level]->setManagedSurface2D(mTexStorage, level); } } @@ -657,9 +662,9 @@ bool TextureD3D_2D::ensureRenderTarget() ASSERT(mTexStorage); if (!mTexStorage->isRenderTarget()) { - TextureStorageInterface2D *newRenderTargetStorage = createCompleteStorage(true); + TextureStorage *newRenderTargetStorage = createCompleteStorage(true); - if (!mRenderer->copyToRenderTarget(newRenderTargetStorage, mTexStorage)) + if (!mRenderer->copyToRenderTarget2D(newRenderTargetStorage, mTexStorage)) { delete newRenderTargetStorage; return gl::error(GL_OUT_OF_MEMORY, false); @@ -672,7 +677,7 @@ bool TextureD3D_2D::ensureRenderTarget() return (mTexStorage && mTexStorage->isRenderTarget()); } -TextureStorageInterface *TextureD3D_2D::getBaseLevelStorage() +TextureStorage *TextureD3D_2D::getBaseLevelStorage() { return mTexStorage; } @@ -727,7 +732,7 @@ void TextureD3D_2D::commitRect(GLint level, GLint xoffset, GLint yoffset, GLsize if (isValidLevel(level)) { ImageD3D *image = mImageArray[level]; - if (image->copyToStorage(mTexStorage, level, xoffset, yoffset, width, height)) + if (image->copyToStorage2D(mTexStorage, level, xoffset, yoffset, width, height)) { image->markClean(); } @@ -873,7 +878,7 @@ void TextureD3D_Cube::copyImage(GLenum target, GLint level, GLenum format, GLint sourceRect.y = y; sourceRect.height = height; - mRenderer->copyImage(source, sourceRect, format, 0, 0, mTexStorage, target, level); + mRenderer->copyImageCube(source, sourceRect, format, 0, 0, mTexStorage, target, level); } } } @@ -906,8 +911,8 @@ void TextureD3D_Cube::copySubImage(GLenum target, GLint level, GLint xoffset, GL sourceRect.y = y; sourceRect.height = height; - mRenderer->copyImage(source, sourceRect, gl::GetInternalFormatInfo(getBaseLevelInternalFormat()).format, - xoffset, yoffset, mTexStorage, target, level); + mRenderer->copyImageCube(source, sourceRect, gl::GetInternalFormatInfo(getBaseLevelInternalFormat()).format, + xoffset, yoffset, mTexStorage, target, level); } } } @@ -936,7 +941,9 @@ void TextureD3D_Cube::storage(GLenum target, GLsizei levels, GLenum internalform mImmutable = true; - setCompleteTexStorage(new TextureStorageInterfaceCube(mRenderer, internalformat, IsRenderTargetUsage(mUsage), width, levels)); + bool renderTarget = IsRenderTargetUsage(mUsage); + TextureStorage *storage = mRenderer->createTextureStorageCube(internalformat, renderTarget, width, levels); + setCompleteTexStorage(storage); } // Tests for cube texture completeness. [OpenGL ES 2.0.24] section 3.7.10 page 81. @@ -992,12 +999,12 @@ void TextureD3D_Cube::generateMipmaps() if (mTexStorage && mTexStorage->isRenderTarget()) { + mTexStorage->generateMipmaps(); + for (int faceIndex = 0; faceIndex < 6; faceIndex++) { for (int level = 1; level < levelCount; level++) { - mTexStorage->generateMipmap(faceIndex, level); - mImageArray[faceIndex][level]->markClean(); } } @@ -1014,16 +1021,14 @@ void TextureD3D_Cube::generateMipmaps() } } -unsigned int TextureD3D_Cube::getRenderTargetSerial(GLint level, GLint layer) +unsigned int TextureD3D_Cube::getRenderTargetSerial(const gl::ImageIndex &index) { - GLenum target = gl::TextureCubeMap::layerIndexToTarget(layer); - return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(target, level) : 0); + return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(index) : 0); } -RenderTarget *TextureD3D_Cube::getRenderTarget(GLint level, GLint layer) +RenderTarget *TextureD3D_Cube::getRenderTarget(const gl::ImageIndex &index) { - GLenum target = gl::TextureCubeMap::layerIndexToTarget(layer); - ASSERT(gl::IsCubemapTextureTarget(target)); + ASSERT(gl::IsCubemapTextureTarget(index.type)); // ensure the underlying texture is created if (!ensureRenderTarget()) @@ -1031,8 +1036,8 @@ RenderTarget *TextureD3D_Cube::getRenderTarget(GLint level, GLint layer) return NULL; } - updateStorageFaceLevel(layer, level); - return mTexStorage->getRenderTarget(target, level); + updateStorageFaceLevel(index.layerIndex, index.mipIndex); + return mTexStorage->getRenderTarget(index); } void TextureD3D_Cube::initializeStorage(bool renderTarget) @@ -1058,7 +1063,7 @@ void TextureD3D_Cube::initializeStorage(bool renderTarget) updateStorage(); } -TextureStorageInterfaceCube *TextureD3D_Cube::createCompleteStorage(bool renderTarget) const +TextureStorage *TextureD3D_Cube::createCompleteStorage(bool renderTarget) const { GLsizei size = getBaseLevelWidth(); @@ -1067,10 +1072,10 @@ TextureStorageInterfaceCube *TextureD3D_Cube::createCompleteStorage(bool renderT // use existing storage level count, when previously specified by TexStorage*D GLint levels = (mTexStorage ? mTexStorage->getLevelCount() : creationLevels(size, size, 1)); - return new TextureStorageInterfaceCube(mRenderer, getBaseLevelInternalFormat(), renderTarget, size, levels); + return mRenderer->createTextureStorageCube(getBaseLevelInternalFormat(), renderTarget, size, levels); } -void TextureD3D_Cube::setCompleteTexStorage(TextureStorageInterfaceCube *newCompleteTexStorage) +void TextureD3D_Cube::setCompleteTexStorage(TextureStorage *newCompleteTexStorage) { SafeDelete(mTexStorage); mTexStorage = newCompleteTexStorage; @@ -1081,7 +1086,7 @@ void TextureD3D_Cube::setCompleteTexStorage(TextureStorageInterfaceCube *newComp { for (int level = 0; level < mTexStorage->getLevelCount(); level++) { - mImageArray[faceIndex][level]->setManagedSurface(mTexStorage, faceIndex, level); + mImageArray[faceIndex][level]->setManagedSurfaceCube(mTexStorage, faceIndex, level); } } } @@ -1114,9 +1119,9 @@ bool TextureD3D_Cube::ensureRenderTarget() ASSERT(mTexStorage); if (!mTexStorage->isRenderTarget()) { - TextureStorageInterfaceCube *newRenderTargetStorage = createCompleteStorage(true); + TextureStorage *newRenderTargetStorage = createCompleteStorage(true); - if (!mRenderer->copyToRenderTarget(newRenderTargetStorage, mTexStorage)) + if (!mRenderer->copyToRenderTargetCube(newRenderTargetStorage, mTexStorage)) { delete newRenderTargetStorage; return gl::error(GL_OUT_OF_MEMORY, false); @@ -1129,7 +1134,7 @@ bool TextureD3D_Cube::ensureRenderTarget() return (mTexStorage && mTexStorage->isRenderTarget()); } -TextureStorageInterface *TextureD3D_Cube::getBaseLevelStorage() +TextureStorage *TextureD3D_Cube::getBaseLevelStorage() { return mTexStorage; } @@ -1235,7 +1240,7 @@ void TextureD3D_Cube::commitRect(int faceIndex, GLint level, GLint xoffset, GLin if (isValidFaceLevel(faceIndex, level)) { ImageD3D *image = mImageArray[faceIndex][level]; - if (image->copyToStorage(mTexStorage, faceIndex, level, xoffset, yoffset, width, height)) + if (image->copyToStorageCube(mTexStorage, faceIndex, level, xoffset, yoffset, width, height)) image->markClean(); } } @@ -1274,7 +1279,7 @@ Image *TextureD3D_3D::getImage(int level, int layer) const Image *TextureD3D_3D::getImage(const gl::ImageIndex &index) const { ASSERT(index.mipIndex < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - ASSERT(index.layerIndex == 0); + ASSERT(!index.hasLayer()); ASSERT(index.type == GL_TEXTURE_3D); return mImageArray[index.mipIndex]; } @@ -1335,7 +1340,8 @@ void TextureD3D_3D::setImage(GLenum target, GLint level, GLsizei width, GLsizei if (isFastUnpackable(unpack, sizedInternalFormat)) { // Will try to create RT storage if it does not exist - RenderTarget *destRenderTarget = getRenderTarget(level); + gl::ImageIndex index = gl::ImageIndex::Make3D(level); + RenderTarget *destRenderTarget = getRenderTarget(index); gl::Box destArea(0, 0, 0, getWidth(level), getHeight(level), getDepth(level)); if (destRenderTarget && fastUnpackPixels(unpack, pixels, destArea, sizedInternalFormat, type, destRenderTarget)) @@ -1369,10 +1375,12 @@ void TextureD3D_3D::subImage(GLenum target, GLint level, GLint xoffset, GLint yo bool fastUnpacked = false; + gl::ImageIndex index = gl::ImageIndex::Make3D(level); + // Attempt a fast gpu copy of the pixel data to the surface if the app bound an unpack buffer if (isFastUnpackable(unpack, getInternalFormat(level))) { - RenderTarget *destRenderTarget = getRenderTarget(level); + RenderTarget *destRenderTarget = getRenderTarget(index); gl::Box destArea(xoffset, yoffset, zoffset, width, height, depth); if (destRenderTarget && fastUnpackPixels(unpack, pixels, destArea, getInternalFormat(level), type, destRenderTarget)) @@ -1384,7 +1392,6 @@ void TextureD3D_3D::subImage(GLenum target, GLint level, GLint xoffset, GLint yo } } - gl::ImageIndex index = gl::ImageIndex::Make3D(level); if (!fastUnpacked && TextureD3D::subImage(xoffset, yoffset, zoffset, width, height, depth, format, type, unpack, pixels, index)) { commitRect(level, xoffset, yoffset, zoffset, width, height, depth); @@ -1433,9 +1440,9 @@ void TextureD3D_3D::copySubImage(GLenum target, GLint level, GLint xoffset, GLin sourceRect.y = y; sourceRect.height = height; - mRenderer->copyImage(source, sourceRect, - gl::GetInternalFormatInfo(getBaseLevelInternalFormat()).format, - xoffset, yoffset, zoffset, mTexStorage, level); + mRenderer->copyImage3D(source, sourceRect, + gl::GetInternalFormatInfo(getBaseLevelInternalFormat()).format, + xoffset, yoffset, zoffset, mTexStorage, level); } } } @@ -1459,7 +1466,9 @@ void TextureD3D_3D::storage(GLenum target, GLsizei levels, GLenum internalformat mImmutable = true; - setCompleteTexStorage(new TextureStorageInterface3D(mRenderer, internalformat, IsRenderTargetUsage(mUsage), width, height, depth, levels)); + bool renderTarget = IsRenderTargetUsage(mUsage); + TextureStorage *storage = mRenderer->createTextureStorage3D(internalformat, renderTarget, width, height, depth, levels); + setCompleteTexStorage(storage); } void TextureD3D_3D::bindTexImage(egl::Surface *surface) @@ -1487,10 +1496,10 @@ void TextureD3D_3D::generateMipmaps() if (mTexStorage && mTexStorage->isRenderTarget()) { + mTexStorage->generateMipmaps(); + for (int level = 1; level < levelCount; level++) { - mTexStorage->generateMipmap(level); - mImageArray[level]->markClean(); } } @@ -1503,12 +1512,12 @@ void TextureD3D_3D::generateMipmaps() } } -unsigned int TextureD3D_3D::getRenderTargetSerial(GLint level, GLint layer) +unsigned int TextureD3D_3D::getRenderTargetSerial(const gl::ImageIndex &index) { - return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(level, layer) : 0); + return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(index) : 0); } -RenderTarget *TextureD3D_3D::getRenderTarget(GLint level) +RenderTarget *TextureD3D_3D::getRenderTarget(const gl::ImageIndex &index) { // ensure the underlying texture is created if (!ensureRenderTarget()) @@ -1516,28 +1525,16 @@ RenderTarget *TextureD3D_3D::getRenderTarget(GLint level) return NULL; } - updateStorageLevel(level); - - // ensure this is NOT a depth texture - if (isDepth(level)) + if (index.hasLayer()) { - return NULL; + updateStorage(); } - - return mTexStorage->getRenderTarget(level); -} - -RenderTarget *TextureD3D_3D::getRenderTarget(GLint level, GLint layer) -{ - // ensure the underlying texture is created - if (!ensureRenderTarget()) + else { - return NULL; + updateStorageLevel(index.mipIndex); } - updateStorage(); - - return mTexStorage->getRenderTarget(level, layer); + return mTexStorage->getRenderTarget(index); } void TextureD3D_3D::initializeStorage(bool renderTarget) @@ -1563,21 +1560,22 @@ void TextureD3D_3D::initializeStorage(bool renderTarget) updateStorage(); } -TextureStorageInterface3D *TextureD3D_3D::createCompleteStorage(bool renderTarget) const +TextureStorage *TextureD3D_3D::createCompleteStorage(bool renderTarget) const { GLsizei width = getBaseLevelWidth(); GLsizei height = getBaseLevelHeight(); GLsizei depth = getBaseLevelDepth(); + GLenum internalFormat = getBaseLevelInternalFormat(); ASSERT(width > 0 && height > 0 && depth > 0); // use existing storage level count, when previously specified by TexStorage*D GLint levels = (mTexStorage ? mTexStorage->getLevelCount() : creationLevels(width, height, depth)); - return new TextureStorageInterface3D(mRenderer, getBaseLevelInternalFormat(), renderTarget, width, height, depth, levels); + return mRenderer->createTextureStorage3D(internalFormat, renderTarget, width, height, depth, levels); } -void TextureD3D_3D::setCompleteTexStorage(TextureStorageInterface3D *newCompleteTexStorage) +void TextureD3D_3D::setCompleteTexStorage(TextureStorage *newCompleteTexStorage) { SafeDelete(mTexStorage); mTexStorage = newCompleteTexStorage; @@ -1609,9 +1607,9 @@ bool TextureD3D_3D::ensureRenderTarget() ASSERT(mTexStorage); if (!mTexStorage->isRenderTarget()) { - TextureStorageInterface3D *newRenderTargetStorage = createCompleteStorage(true); + TextureStorage *newRenderTargetStorage = createCompleteStorage(true); - if (!mRenderer->copyToRenderTarget(newRenderTargetStorage, mTexStorage)) + if (!mRenderer->copyToRenderTarget3D(newRenderTargetStorage, mTexStorage)) { delete newRenderTargetStorage; return gl::error(GL_OUT_OF_MEMORY, false); @@ -1624,7 +1622,7 @@ bool TextureD3D_3D::ensureRenderTarget() return (mTexStorage && mTexStorage->isRenderTarget()); } -TextureStorageInterface *TextureD3D_3D::getBaseLevelStorage() +TextureStorage *TextureD3D_3D::getBaseLevelStorage() { return mTexStorage; } @@ -1734,7 +1732,7 @@ void TextureD3D_3D::commitRect(GLint level, GLint xoffset, GLint yoffset, GLint if (isValidLevel(level)) { ImageD3D *image = mImageArray[level]; - if (image->copyToStorage(mTexStorage, level, xoffset, yoffset, zoffset, width, height, depth)) + if (image->copyToStorage3D(mTexStorage, level, xoffset, yoffset, zoffset, width, height, depth)) { image->markClean(); } @@ -1914,8 +1912,8 @@ void TextureD3D_2DArray::copySubImage(GLenum target, GLint level, GLint xoffset, sourceRect.y = y; sourceRect.height = height; - mRenderer->copyImage(source, sourceRect, gl::GetInternalFormatInfo(getInternalFormat(0)).format, - xoffset, yoffset, zoffset, mTexStorage, level); + mRenderer->copyImage2DArray(source, sourceRect, gl::GetInternalFormatInfo(getInternalFormat(0)).format, + xoffset, yoffset, zoffset, mTexStorage, level); } } } @@ -1948,7 +1946,10 @@ void TextureD3D_2DArray::storage(GLenum target, GLsizei levels, GLenum internalf } mImmutable = true; - setCompleteTexStorage(new TextureStorageInterface2DArray(mRenderer, internalformat, IsRenderTargetUsage(mUsage), width, height, depth, levels)); + + bool renderTarget = IsRenderTargetUsage(mUsage); + TextureStorage *storage = mRenderer->createTextureStorage2DArray(internalformat, renderTarget, width, height, depth, levels); + setCompleteTexStorage(storage); } void TextureD3D_2DArray::bindTexImage(egl::Surface *surface) @@ -1978,10 +1979,10 @@ void TextureD3D_2DArray::generateMipmaps() if (mTexStorage && mTexStorage->isRenderTarget()) { + mTexStorage->generateMipmaps(); + for (int level = 1; level < levelCount; level++) { - mTexStorage->generateMipmap(level); - for (int layer = 0; layer < mLayerCounts[level]; layer++) { mImageArray[level][layer]->markClean(); @@ -2000,12 +2001,12 @@ void TextureD3D_2DArray::generateMipmaps() } } -unsigned int TextureD3D_2DArray::getRenderTargetSerial(GLint level, GLint layer) +unsigned int TextureD3D_2DArray::getRenderTargetSerial(const gl::ImageIndex &index) { - return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(level, layer) : 0); + return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(index) : 0); } -RenderTarget *TextureD3D_2DArray::getRenderTarget(GLint level, GLint layer) +RenderTarget *TextureD3D_2DArray::getRenderTarget(const gl::ImageIndex &index) { // ensure the underlying texture is created if (!ensureRenderTarget()) @@ -2013,8 +2014,8 @@ RenderTarget *TextureD3D_2DArray::getRenderTarget(GLint level, GLint layer) return NULL; } - updateStorageLevel(level); - return mTexStorage->getRenderTarget(level, layer); + updateStorageLevel(index.mipIndex); + return mTexStorage->getRenderTarget(index); } void TextureD3D_2DArray::initializeStorage(bool renderTarget) @@ -2040,21 +2041,22 @@ void TextureD3D_2DArray::initializeStorage(bool renderTarget) updateStorage(); } -TextureStorageInterface2DArray *TextureD3D_2DArray::createCompleteStorage(bool renderTarget) const +TextureStorage *TextureD3D_2DArray::createCompleteStorage(bool renderTarget) const { GLsizei width = getBaseLevelWidth(); GLsizei height = getBaseLevelHeight(); GLsizei depth = getLayers(0); + GLenum internalFormat = getBaseLevelInternalFormat(); ASSERT(width > 0 && height > 0 && depth > 0); // use existing storage level count, when previously specified by TexStorage*D GLint levels = (mTexStorage ? mTexStorage->getLevelCount() : creationLevels(width, height, 1)); - return new TextureStorageInterface2DArray(mRenderer, getBaseLevelInternalFormat(), renderTarget, width, height, depth, levels); + return mRenderer->createTextureStorage2DArray(internalFormat, renderTarget, width, height, depth, levels); } -void TextureD3D_2DArray::setCompleteTexStorage(TextureStorageInterface2DArray *newCompleteTexStorage) +void TextureD3D_2DArray::setCompleteTexStorage(TextureStorage *newCompleteTexStorage) { SafeDelete(mTexStorage); mTexStorage = newCompleteTexStorage; @@ -2086,9 +2088,9 @@ bool TextureD3D_2DArray::ensureRenderTarget() ASSERT(mTexStorage); if (!mTexStorage->isRenderTarget()) { - TextureStorageInterface2DArray *newRenderTargetStorage = createCompleteStorage(true); + TextureStorage *newRenderTargetStorage = createCompleteStorage(true); - if (!mRenderer->copyToRenderTarget(newRenderTargetStorage, mTexStorage)) + if (!mRenderer->copyToRenderTarget2DArray(newRenderTargetStorage, mTexStorage)) { delete newRenderTargetStorage; return gl::error(GL_OUT_OF_MEMORY, false); @@ -2106,7 +2108,7 @@ const ImageD3D *TextureD3D_2DArray::getBaseLevelImage() const return (mLayerCounts[0] > 0 ? mImageArray[0][0] : NULL); } -TextureStorageInterface *TextureD3D_2DArray::getBaseLevelStorage() +TextureStorage *TextureD3D_2DArray::getBaseLevelStorage() { return mTexStorage; } @@ -2248,7 +2250,7 @@ void TextureD3D_2DArray::commitRect(GLint level, GLint xoffset, GLint yoffset, G if (isValidLevel(level) && layerTarget < getLayers(level)) { ImageD3D *image = mImageArray[level][layerTarget]; - if (image->copyToStorage(mTexStorage, level, xoffset, yoffset, layerTarget, width, height)) + if (image->copyToStorage2DArray(mTexStorage, level, xoffset, yoffset, layerTarget, width, height)) { image->markClean(); } diff --git a/src/libGLESv2/renderer/d3d/TextureD3D.h b/src/libGLESv2/renderer/d3d/TextureD3D.h index 1ede45e2..41c73180 100644 --- a/src/libGLESv2/renderer/d3d/TextureD3D.h +++ b/src/libGLESv2/renderer/d3d/TextureD3D.h @@ -25,11 +25,7 @@ class Image; class ImageD3D; class Renderer; class RenderTarget; -class TextureStorageInterface; -class TextureStorageInterface2D; -class TextureStorageInterfaceCube; -class TextureStorageInterface3D; -class TextureStorageInterface2DArray; +class TextureStorage; class TextureD3D : public TextureImpl { @@ -39,7 +35,7 @@ class TextureD3D : public TextureImpl static TextureD3D *makeTextureD3D(TextureImpl *texture); - virtual TextureStorageInterface *getNativeTexture(); + virtual TextureStorage *getNativeTexture(); virtual void setUsage(GLenum usage) { mUsage = usage; } bool hasDirtyImages() const { return mDirtyImages; } @@ -52,8 +48,8 @@ class TextureD3D : public TextureImpl bool isImmutable() const { return mImmutable; } - virtual RenderTarget *getRenderTarget(GLint level, GLint layer) = 0; - virtual unsigned int getRenderTargetSerial(GLint level, GLint layer) = 0; + virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0; + virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index) = 0; protected: void setImage(const gl::PixelUnpackState &unpack, GLenum type, const void *pixels, Image *image); @@ -64,7 +60,7 @@ class TextureD3D : public TextureImpl GLenum format, GLsizei imageSize, const void *pixels, Image *image); bool isFastUnpackable(const gl::PixelUnpackState &unpack, GLenum sizedInternalFormat); bool fastUnpackPixels(const gl::PixelUnpackState &unpack, const void *pixels, const gl::Box &destArea, - GLenum sizedInternalFormat, GLenum type, RenderTarget *destRenderTarget); + GLenum sizedInternalFormat, GLenum type, RenderTarget *destRenderTarget); GLint creationLevels(GLsizei width, GLsizei height, GLsizei depth) const; int mipLevels() const; @@ -83,7 +79,7 @@ class TextureD3D : public TextureImpl virtual void initializeStorage(bool renderTarget) = 0; virtual void updateStorage() = 0; - virtual TextureStorageInterface *getBaseLevelStorage() = 0; + virtual TextureStorage *getBaseLevelStorage() = 0; virtual const ImageD3D *getBaseLevelImage() const = 0; }; @@ -116,19 +112,19 @@ class TextureD3D_2D : public TextureD3D virtual void generateMipmaps(); - virtual RenderTarget *getRenderTarget(GLint level, GLint layer); - virtual unsigned int getRenderTargetSerial(GLint level, GLint layer); + virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); + virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index); private: DISALLOW_COPY_AND_ASSIGN(TextureD3D_2D); virtual void initializeStorage(bool renderTarget); - TextureStorageInterface2D *createCompleteStorage(bool renderTarget) const; - void setCompleteTexStorage(TextureStorageInterface2D *newCompleteTexStorage); + TextureStorage *createCompleteStorage(bool renderTarget) const; + void setCompleteTexStorage(TextureStorage *newCompleteTexStorage); virtual void updateStorage(); bool ensureRenderTarget(); - virtual TextureStorageInterface *getBaseLevelStorage(); + virtual TextureStorage *getBaseLevelStorage(); virtual const ImageD3D *getBaseLevelImage() const; bool isValidLevel(int level) const; @@ -139,7 +135,7 @@ class TextureD3D_2D : public TextureD3D void redefineImage(GLint level, GLenum internalformat, GLsizei width, GLsizei height); void commitRect(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); - TextureStorageInterface2D *mTexStorage; + TextureStorage *mTexStorage; ImageD3D *mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; }; @@ -173,19 +169,19 @@ class TextureD3D_Cube : public TextureD3D virtual void generateMipmaps(); - virtual RenderTarget *getRenderTarget(GLint level, GLint layer); - virtual unsigned int getRenderTargetSerial(GLint level, GLint layer); + virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); + virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index); private: DISALLOW_COPY_AND_ASSIGN(TextureD3D_Cube); virtual void initializeStorage(bool renderTarget); - TextureStorageInterfaceCube *createCompleteStorage(bool renderTarget) const; - void setCompleteTexStorage(TextureStorageInterfaceCube *newCompleteTexStorage); + TextureStorage *createCompleteStorage(bool renderTarget) const; + void setCompleteTexStorage(TextureStorage *newCompleteTexStorage); virtual void updateStorage(); bool ensureRenderTarget(); - virtual TextureStorageInterface *getBaseLevelStorage(); + virtual TextureStorage *getBaseLevelStorage(); virtual const ImageD3D *getBaseLevelImage() const; bool isValidFaceLevel(int faceIndex, int level) const; @@ -198,7 +194,7 @@ class TextureD3D_Cube : public TextureD3D ImageD3D *mImageArray[6][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; - TextureStorageInterfaceCube *mTexStorage; + TextureStorage *mTexStorage; }; class TextureD3D_3D : public TextureD3D @@ -230,20 +226,19 @@ class TextureD3D_3D : public TextureD3D virtual void generateMipmaps(); - RenderTarget *getRenderTarget(GLint level); - virtual RenderTarget *getRenderTarget(GLint level, GLint layer); - virtual unsigned int getRenderTargetSerial(GLint level, GLint layer); + virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); + virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index); private: DISALLOW_COPY_AND_ASSIGN(TextureD3D_3D); virtual void initializeStorage(bool renderTarget); - TextureStorageInterface3D *createCompleteStorage(bool renderTarget) const; - void setCompleteTexStorage(TextureStorageInterface3D *newCompleteTexStorage); + TextureStorage *createCompleteStorage(bool renderTarget) const; + void setCompleteTexStorage(TextureStorage *newCompleteTexStorage); virtual void updateStorage(); bool ensureRenderTarget(); - virtual TextureStorageInterface *getBaseLevelStorage(); + virtual TextureStorage *getBaseLevelStorage(); virtual const ImageD3D *getBaseLevelImage() const; bool isValidLevel(int level) const; @@ -255,7 +250,7 @@ class TextureD3D_3D : public TextureD3D ImageD3D *mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; - TextureStorageInterface3D *mTexStorage; + TextureStorage *mTexStorage; }; class TextureD3D_2DArray : public TextureD3D @@ -287,19 +282,19 @@ class TextureD3D_2DArray : public TextureD3D virtual void generateMipmaps(); - virtual RenderTarget *getRenderTarget(GLint level, GLint layer); - virtual unsigned int getRenderTargetSerial(GLint level, GLint layer); + virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); + virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index); private: DISALLOW_COPY_AND_ASSIGN(TextureD3D_2DArray); virtual void initializeStorage(bool renderTarget); - TextureStorageInterface2DArray *createCompleteStorage(bool renderTarget) const; - void setCompleteTexStorage(TextureStorageInterface2DArray *newCompleteTexStorage); + TextureStorage *createCompleteStorage(bool renderTarget) const; + void setCompleteTexStorage(TextureStorage *newCompleteTexStorage); virtual void updateStorage(); bool ensureRenderTarget(); - virtual TextureStorageInterface *getBaseLevelStorage(); + virtual TextureStorage *getBaseLevelStorage(); virtual const ImageD3D *getBaseLevelImage() const; bool isValidLevel(int level) const; @@ -317,7 +312,7 @@ class TextureD3D_2DArray : public TextureD3D GLsizei mLayerCounts[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; ImageD3D **mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; - TextureStorageInterface2DArray *mTexStorage; + TextureStorage *mTexStorage; }; } diff --git a/src/libGLESv2/renderer/d3d/TextureStorage.cpp b/src/libGLESv2/renderer/d3d/TextureStorage.cpp index 86902e90..dedd266c 100644 --- a/src/libGLESv2/renderer/d3d/TextureStorage.cpp +++ b/src/libGLESv2/renderer/d3d/TextureStorage.cpp @@ -4,9 +4,7 @@ // found in the LICENSE file. // -// TextureStorage.cpp: Implements the abstract rx::TextureStorageInterface class and its concrete derived -// classes TextureStorageInterface2D and TextureStorageInterfaceCube, which act as the interface to the -// GPU-side texture. +// TextureStorage.cpp: Shared members of abstract rx::TextureStorage class. #include "libGLESv2/renderer/d3d/TextureStorage.h" #include "libGLESv2/renderer/d3d/TextureD3D.h" @@ -19,162 +17,35 @@ namespace rx { -unsigned int TextureStorageInterface::mCurrentTextureSerial = 1; -TextureStorageInterface::TextureStorageInterface() - : mTextureSerial(issueTextureSerial()), - mInstance(NULL) -{ -} +unsigned int TextureStorage::mCurrentTextureSerial = 1; -TextureStorageInterface::~TextureStorageInterface() -{ - delete mInstance; -} +TextureStorage::TextureStorage() + : mTextureSerial(issueTextureSerial()), + mFirstRenderTargetSerial(0), + mRenderTargetSerialsLayerStride(0) +{} -bool TextureStorageInterface::isRenderTarget() const +void TextureStorage::initializeSerials(unsigned int rtSerialsToReserve, unsigned int rtSerialsLayerStride) { - return mInstance->isRenderTarget(); + mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(rtSerialsToReserve); + mRenderTargetSerialsLayerStride = rtSerialsLayerStride; } -bool TextureStorageInterface::isManaged() const +unsigned int TextureStorage::getRenderTargetSerial(const gl::ImageIndex &index) const { - return mInstance->isManaged(); + unsigned int layerOffset = (index.hasLayer() ? (static_cast<unsigned int>(index.layerIndex) * mRenderTargetSerialsLayerStride) : 0); + return mFirstRenderTargetSerial + static_cast<unsigned int>(index.mipIndex) + layerOffset; } -unsigned int TextureStorageInterface::getTextureSerial() const +unsigned int TextureStorage::getTextureSerial() const { return mTextureSerial; } -unsigned int TextureStorageInterface::issueTextureSerial() +unsigned int TextureStorage::issueTextureSerial() { return mCurrentTextureSerial++; } -int TextureStorageInterface::getTopLevel() const -{ - return mInstance->getTopLevel(); -} - -int TextureStorageInterface::getLevelCount() const -{ - return mInstance->getLevelCount(); -} - -TextureStorageInterface2D::TextureStorageInterface2D(Renderer *renderer, SwapChain *swapchain) -{ - mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(1); - - mInstance = renderer->createTextureStorage2D(swapchain); -} - -TextureStorageInterface2D::TextureStorageInterface2D(Renderer *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels) -{ - mInstance = renderer->createTextureStorage2D(internalformat, renderTarget, width, height, levels); - mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(static_cast<GLuint>(mInstance->getLevelCount())); -} - -TextureStorageInterface2D::~TextureStorageInterface2D() -{ -} - -RenderTarget *TextureStorageInterface2D::getRenderTarget(GLint level) const -{ - return mInstance->getRenderTarget(level); -} - -void TextureStorageInterface2D::generateMipmap(int level) -{ - mInstance->generateMipmap(level); -} - -unsigned int TextureStorageInterface2D::getRenderTargetSerial(GLint level) const -{ - return mFirstRenderTargetSerial + level; -} - -TextureStorageInterfaceCube::TextureStorageInterfaceCube(Renderer *renderer, GLenum internalformat, bool renderTarget, int size, int levels) -{ - mInstance = renderer->createTextureStorageCube(internalformat, renderTarget, size, levels); - mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(static_cast<GLuint>(mInstance->getLevelCount() * 6)); -} - -TextureStorageInterfaceCube::~TextureStorageInterfaceCube() -{ -} - -RenderTarget *TextureStorageInterfaceCube::getRenderTarget(GLenum faceTarget, GLint level) const -{ - return mInstance->getRenderTargetFace(faceTarget, level); -} - -void TextureStorageInterfaceCube::generateMipmap(int faceIndex, int level) -{ - mInstance->generateMipmap(faceIndex, level); -} - -unsigned int TextureStorageInterfaceCube::getRenderTargetSerial(GLenum target, GLint level) const -{ - return mFirstRenderTargetSerial + (level * 6) + gl::TextureCubeMap::targetToLayerIndex(target); -} - -TextureStorageInterface3D::TextureStorageInterface3D(Renderer *renderer, GLenum internalformat, bool renderTarget, - GLsizei width, GLsizei height, GLsizei depth, int levels) -{ - - mInstance = renderer->createTextureStorage3D(internalformat, renderTarget, width, height, depth, levels); - mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(static_cast<GLuint>(mInstance->getLevelCount() * depth)); -} - -TextureStorageInterface3D::~TextureStorageInterface3D() -{ -} - -void TextureStorageInterface3D::generateMipmap(int level) -{ - mInstance->generateMipmap(level); -} - -RenderTarget *TextureStorageInterface3D::getRenderTarget(GLint level) const -{ - return mInstance->getRenderTarget(level); -} - -RenderTarget *TextureStorageInterface3D::getRenderTarget(GLint level, GLint layer) const -{ - return mInstance->getRenderTargetLayer(level, layer); -} - -unsigned int TextureStorageInterface3D::getRenderTargetSerial(GLint level, GLint layer) const -{ - return mFirstRenderTargetSerial + static_cast<unsigned int>((layer * mInstance->getLevelCount()) + level); -} - -TextureStorageInterface2DArray::TextureStorageInterface2DArray(Renderer *renderer, GLenum internalformat, bool renderTarget, - GLsizei width, GLsizei height, GLsizei depth, int levels) -{ - mInstance = renderer->createTextureStorage2DArray(internalformat, renderTarget, width, height, depth, levels); - mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(static_cast<GLuint>(mInstance->getLevelCount() * depth)); -} - -TextureStorageInterface2DArray::~TextureStorageInterface2DArray() -{ -} - -void TextureStorageInterface2DArray::generateMipmap(int level) -{ - mInstance->generateMipmap(level); -} - -RenderTarget *TextureStorageInterface2DArray::getRenderTarget(GLint level, GLint layer) const -{ - return mInstance->getRenderTargetLayer(level, layer); -} - -unsigned int TextureStorageInterface2DArray::getRenderTargetSerial(GLint level, GLint layer) const -{ - return mFirstRenderTargetSerial + static_cast<unsigned int>((layer * mInstance->getLevelCount()) + level); -} - } diff --git a/src/libGLESv2/renderer/d3d/TextureStorage.h b/src/libGLESv2/renderer/d3d/TextureStorage.h index c42d4b68..9cc2c297 100644 --- a/src/libGLESv2/renderer/d3d/TextureStorage.h +++ b/src/libGLESv2/renderer/d3d/TextureStorage.h @@ -4,9 +4,7 @@ // found in the LICENSE file. // -// TextureStorage.h: Defines the abstract rx::TextureStorageInterface class and its concrete derived -// classes TextureStorageInterface2D and TextureStorageInterfaceCube, which act as the interface to the -// GPU-side texture. +// TextureStorage.h: Defines the abstract rx::TextureStorage class. #ifndef LIBGLESV2_RENDERER_TEXTURESTORAGE_H_ #define LIBGLESV2_RENDERER_TEXTURESTORAGE_H_ @@ -15,6 +13,11 @@ #include <GLES2/gl2.h> +namespace gl +{ +struct ImageIndex; +} + namespace rx { class Renderer; @@ -24,7 +27,7 @@ class RenderTarget; class TextureStorage { public: - TextureStorage() {}; + TextureStorage(); virtual ~TextureStorage() {}; virtual int getTopLevel() const = 0; @@ -32,114 +35,25 @@ class TextureStorage virtual bool isManaged() const = 0; virtual int getLevelCount() const = 0; - virtual RenderTarget *getRenderTarget(int level) = 0; - virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level) = 0; - virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer) = 0; - virtual void generateMipmap(int level) = 0; - virtual void generateMipmap(int face, int level) = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(TextureStorage); - -}; - -class TextureStorageInterface -{ - public: - TextureStorageInterface(); - virtual ~TextureStorageInterface(); - - TextureStorage *getStorageInstance() { return mInstance; } + virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0; + virtual void generateMipmaps() = 0; + unsigned int getRenderTargetSerial(const gl::ImageIndex &index) const; unsigned int getTextureSerial() const; - virtual int getTopLevel() const; - virtual bool isRenderTarget() const; - virtual bool isManaged() const; - virtual int getLevelCount() const; - protected: - TextureStorage *mInstance; + void initializeSerials(unsigned int rtSerialsToReserve, unsigned int rtSerialsLayerStride); private: - DISALLOW_COPY_AND_ASSIGN(TextureStorageInterface); + DISALLOW_COPY_AND_ASSIGN(TextureStorage); const unsigned int mTextureSerial; static unsigned int issueTextureSerial(); static unsigned int mCurrentTextureSerial; -}; - -class TextureStorageInterface2D : public TextureStorageInterface -{ - public: - TextureStorageInterface2D(Renderer *renderer, SwapChain *swapchain); - TextureStorageInterface2D(Renderer *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels); - virtual ~TextureStorageInterface2D(); - - void generateMipmap(int level); - RenderTarget *getRenderTarget(GLint level) const; - - unsigned int getRenderTargetSerial(GLint level) const; - - private: - DISALLOW_COPY_AND_ASSIGN(TextureStorageInterface2D); - - unsigned int mFirstRenderTargetSerial; -}; - -class TextureStorageInterfaceCube : public TextureStorageInterface -{ - public: - TextureStorageInterfaceCube(Renderer *renderer, GLenum internalformat, bool renderTarget, int size, int levels); - virtual ~TextureStorageInterfaceCube(); - - void generateMipmap(int faceIndex, int level); - RenderTarget *getRenderTarget(GLenum faceTarget, GLint level) const; - - virtual unsigned int getRenderTargetSerial(GLenum target, GLint level) const; - - private: - DISALLOW_COPY_AND_ASSIGN(TextureStorageInterfaceCube); - - unsigned int mFirstRenderTargetSerial; -}; - -class TextureStorageInterface3D : public TextureStorageInterface -{ - public: - TextureStorageInterface3D(Renderer *renderer, GLenum internalformat, bool renderTarget, - GLsizei width, GLsizei height, GLsizei depth, int levels); - virtual ~TextureStorageInterface3D(); - - void generateMipmap(int level); - RenderTarget *getRenderTarget(GLint level) const; - RenderTarget *getRenderTarget(GLint level, GLint layer) const; - - virtual unsigned int getRenderTargetSerial(GLint level, GLint layer) const; - - private: - DISALLOW_COPY_AND_ASSIGN(TextureStorageInterface3D); - - unsigned int mFirstRenderTargetSerial; -}; - -class TextureStorageInterface2DArray : public TextureStorageInterface -{ - public: - TextureStorageInterface2DArray(Renderer *renderer, GLenum internalformat, bool renderTarget, - GLsizei width, GLsizei height, GLsizei depth, int levels); - virtual ~TextureStorageInterface2DArray(); - - void generateMipmap(int level); - RenderTarget *getRenderTarget(GLint level, GLint layer) const; - - virtual unsigned int getRenderTargetSerial(GLint level, GLint layer) const; - - private: - DISALLOW_COPY_AND_ASSIGN(TextureStorageInterface2DArray); unsigned int mFirstRenderTargetSerial; + unsigned int mRenderTargetSerialsLayerStride; }; } diff --git a/src/libGLESv2/renderer/d3d/VertexBuffer.cpp b/src/libGLESv2/renderer/d3d/VertexBuffer.cpp index d2a1e8fc..4f85eb94 100644 --- a/src/libGLESv2/renderer/d3d/VertexBuffer.cpp +++ b/src/libGLESv2/renderer/d3d/VertexBuffer.cpp @@ -62,7 +62,7 @@ unsigned int VertexBufferInterface::getBufferSize() const return mVertexBuffer->getBufferSize(); } -bool VertexBufferInterface::setBufferSize(unsigned int size) +gl::Error VertexBufferInterface::setBufferSize(unsigned int size) { if (mVertexBuffer->getBufferSize() == 0) { @@ -84,34 +84,39 @@ void VertexBufferInterface::setWritePosition(unsigned int writePosition) mWritePosition = writePosition; } -bool VertexBufferInterface::discard() +gl::Error VertexBufferInterface::discard() { return mVertexBuffer->discard(); } -bool VertexBufferInterface::storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, - GLint start, GLsizei count, GLsizei instances, unsigned int *outStreamOffset) +gl::Error VertexBufferInterface::storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, + GLint start, GLsizei count, GLsizei instances, unsigned int *outStreamOffset) { + gl::Error error(GL_NO_ERROR); + unsigned int spaceRequired; - if (!mVertexBuffer->getSpaceRequired(attrib, count, instances, &spaceRequired)) + error = mVertexBuffer->getSpaceRequired(attrib, count, instances, &spaceRequired); + if (error.isError()) { - return false; + return error; } if (mWritePosition + spaceRequired < mWritePosition) { - return false; + return gl::Error(GL_OUT_OF_MEMORY, "Internal error, new vertex buffer write position would overflow."); } - if (!reserveSpace(mReservedSpace)) + error = reserveSpace(mReservedSpace); + if (error.isError()) { - return false; + return error; } mReservedSpace = 0; - if (!mVertexBuffer->storeVertexAttributes(attrib, currentValue, start, count, instances, mWritePosition)) + error = mVertexBuffer->storeVertexAttributes(attrib, currentValue, start, count, instances, mWritePosition); + if (error.isError()) { - return false; + return error; } if (outStreamOffset) @@ -124,21 +129,25 @@ bool VertexBufferInterface::storeVertexAttributes(const gl::VertexAttribute &att // Align to 16-byte boundary mWritePosition = rx::roundUp(mWritePosition, 16u); - return true; + return gl::Error(GL_NO_ERROR); } -bool VertexBufferInterface::reserveVertexSpace(const gl::VertexAttribute &attrib, GLsizei count, GLsizei instances) +gl::Error VertexBufferInterface::reserveVertexSpace(const gl::VertexAttribute &attrib, GLsizei count, GLsizei instances) { + gl::Error error(GL_NO_ERROR); + unsigned int requiredSpace; - if (!mVertexBuffer->getSpaceRequired(attrib, count, instances, &requiredSpace)) + error = mVertexBuffer->getSpaceRequired(attrib, count, instances, &requiredSpace); + if (error.isError()) { - return false; + return error; } // Protect against integer overflow if (mReservedSpace + requiredSpace < mReservedSpace) { - return false; + return gl::Error(GL_OUT_OF_MEMORY, "Unable to reserve %u extra bytes in internal vertex buffer, " + "it would result in an overflow.", requiredSpace); } mReservedSpace += requiredSpace; @@ -146,7 +155,7 @@ bool VertexBufferInterface::reserveVertexSpace(const gl::VertexAttribute &attrib // Align to 16-byte boundary mReservedSpace = rx::roundUp(mReservedSpace, 16u); - return true; + return gl::Error(GL_NO_ERROR); } VertexBuffer* VertexBufferInterface::getVertexBuffer() const @@ -197,25 +206,29 @@ StreamingVertexBufferInterface::~StreamingVertexBufferInterface() { } -bool StreamingVertexBufferInterface::reserveSpace(unsigned int size) +gl::Error StreamingVertexBufferInterface::reserveSpace(unsigned int size) { - bool result = true; unsigned int curBufferSize = getBufferSize(); if (size > curBufferSize) { - result = setBufferSize(std::max(size, 3 * curBufferSize / 2)); + gl::Error error = setBufferSize(std::max(size, 3 * curBufferSize / 2)); + if (error.isError()) + { + return error; + } setWritePosition(0); } else if (getWritePosition() + size > curBufferSize) { - if (!discard()) + gl::Error error = discard(); + if (error.isError()) { - return false; + return error; } setWritePosition(0); } - return result; + return gl::Error(GL_NO_ERROR); } StaticVertexBufferInterface::StaticVertexBufferInterface(rx::Renderer *renderer) : VertexBufferInterface(renderer, false) @@ -251,46 +264,44 @@ bool StaticVertexBufferInterface::lookupAttribute(const gl::VertexAttribute &att return false; } -bool StaticVertexBufferInterface::reserveSpace(unsigned int size) +gl::Error StaticVertexBufferInterface::reserveSpace(unsigned int size) { unsigned int curSize = getBufferSize(); if (curSize == 0) { - setBufferSize(size); - return true; + return setBufferSize(size); } else if (curSize >= size) { - return true; + return gl::Error(GL_NO_ERROR); } else { - UNREACHABLE(); // Static vertex buffers can't be resized - return false; + UNREACHABLE(); + return gl::Error(GL_INVALID_OPERATION, "Internal error, Static vertex buffers can't be resized."); } } -bool StaticVertexBufferInterface::storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, - GLint start, GLsizei count, GLsizei instances, unsigned int *outStreamOffset) +gl::Error StaticVertexBufferInterface::storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, + GLint start, GLsizei count, GLsizei instances, unsigned int *outStreamOffset) { unsigned int streamOffset; - if (VertexBufferInterface::storeVertexAttributes(attrib, currentValue, start, count, instances, &streamOffset)) + gl::Error error = VertexBufferInterface::storeVertexAttributes(attrib, currentValue, start, count, instances, &streamOffset); + if (error.isError()) { - size_t attributeOffset = static_cast<size_t>(attrib.offset) % ComputeVertexAttributeStride(attrib); - VertexElement element = { attrib.type, attrib.size, ComputeVertexAttributeStride(attrib), attrib.normalized, attrib.pureInteger, attributeOffset, streamOffset }; - mCache.push_back(element); + return error; + } - if (outStreamOffset) - { - *outStreamOffset = streamOffset; - } + size_t attributeOffset = static_cast<size_t>(attrib.offset) % ComputeVertexAttributeStride(attrib); + VertexElement element = { attrib.type, attrib.size, ComputeVertexAttributeStride(attrib), attrib.normalized, attrib.pureInteger, attributeOffset, streamOffset }; + mCache.push_back(element); - return true; - } - else + if (outStreamOffset) { - return false; + *outStreamOffset = streamOffset; } + + return gl::Error(GL_NO_ERROR); } } diff --git a/src/libGLESv2/renderer/d3d/VertexBuffer.h b/src/libGLESv2/renderer/d3d/VertexBuffer.h index e36084fe..fa747d9c 100644 --- a/src/libGLESv2/renderer/d3d/VertexBuffer.h +++ b/src/libGLESv2/renderer/d3d/VertexBuffer.h @@ -11,6 +11,7 @@ #define LIBGLESV2_RENDERER_VERTEXBUFFER_H_ #include "common/angleutils.h" +#include "libGLESv2/Error.h" #include <GLES2/gl2.h> @@ -33,16 +34,16 @@ class VertexBuffer VertexBuffer(); virtual ~VertexBuffer(); - virtual bool initialize(unsigned int size, bool dynamicUsage) = 0; + virtual gl::Error initialize(unsigned int size, bool dynamicUsage) = 0; - virtual bool storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, - GLint start, GLsizei count, GLsizei instances, unsigned int offset) = 0; - virtual bool getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei count, GLsizei instances, - unsigned int *outSpaceRequired) const = 0; + virtual gl::Error storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, + GLint start, GLsizei count, GLsizei instances, unsigned int offset) = 0; + virtual gl::Error getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei count, GLsizei instances, + unsigned int *outSpaceRequired) const = 0; virtual unsigned int getBufferSize() const = 0; - virtual bool setBufferSize(unsigned int size) = 0; - virtual bool discard() = 0; + virtual gl::Error setBufferSize(unsigned int size) = 0; + virtual gl::Error discard() = 0; unsigned int getSerial() const; @@ -62,14 +63,14 @@ class VertexBufferInterface VertexBufferInterface(rx::Renderer *renderer, bool dynamic); virtual ~VertexBufferInterface(); - bool reserveVertexSpace(const gl::VertexAttribute &attribute, GLsizei count, GLsizei instances); + gl::Error reserveVertexSpace(const gl::VertexAttribute &attribute, GLsizei count, GLsizei instances); unsigned int getBufferSize() const; unsigned int getSerial() const; - virtual bool storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, - GLint start, GLsizei count, GLsizei instances, unsigned int *outStreamOffset); + virtual gl::Error storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, + GLint start, GLsizei count, GLsizei instances, unsigned int *outStreamOffset); bool directStoragePossible(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue) const; @@ -77,14 +78,14 @@ class VertexBufferInterface VertexBuffer* getVertexBuffer() const; protected: - virtual bool reserveSpace(unsigned int size) = 0; + virtual gl::Error reserveSpace(unsigned int size) = 0; unsigned int getWritePosition() const; void setWritePosition(unsigned int writePosition); - bool discard(); + gl::Error discard(); - bool setBufferSize(unsigned int size); + gl::Error setBufferSize(unsigned int size); private: DISALLOW_COPY_AND_ASSIGN(VertexBufferInterface); @@ -105,7 +106,7 @@ class StreamingVertexBufferInterface : public VertexBufferInterface ~StreamingVertexBufferInterface(); protected: - bool reserveSpace(unsigned int size); + gl::Error reserveSpace(unsigned int size); }; class StaticVertexBufferInterface : public VertexBufferInterface @@ -114,13 +115,13 @@ class StaticVertexBufferInterface : public VertexBufferInterface explicit StaticVertexBufferInterface(rx::Renderer *renderer); ~StaticVertexBufferInterface(); - bool storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, - GLint start, GLsizei count, GLsizei instances, unsigned int *outStreamOffset); + gl::Error storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, + GLint start, GLsizei count, GLsizei instances, unsigned int *outStreamOffset); bool lookupAttribute(const gl::VertexAttribute &attribute, unsigned int* outStreamFffset); protected: - bool reserveSpace(unsigned int size); + gl::Error reserveSpace(unsigned int size); private: struct VertexElement diff --git a/src/libGLESv2/renderer/d3d/VertexDataManager.cpp b/src/libGLESv2/renderer/d3d/VertexDataManager.cpp index a69bc679..7034b78e 100644 --- a/src/libGLESv2/renderer/d3d/VertexDataManager.cpp +++ b/src/libGLESv2/renderer/d3d/VertexDataManager.cpp @@ -82,12 +82,12 @@ VertexDataManager::~VertexDataManager() } } -GLenum VertexDataManager::prepareVertexData(const gl::VertexAttribute attribs[], const gl::VertexAttribCurrentValueData currentValues[], - gl::ProgramBinary *programBinary, GLint start, GLsizei count, TranslatedAttribute *translated, GLsizei instances) +gl::Error VertexDataManager::prepareVertexData(const gl::VertexAttribute attribs[], const gl::VertexAttribCurrentValueData currentValues[], + gl::ProgramBinary *programBinary, GLint start, GLsizei count, TranslatedAttribute *translated, GLsizei instances) { if (!mStreamingBuffer) { - return GL_OUT_OF_MEMORY; + return gl::Error(GL_OUT_OF_MEMORY, "Internal streaming vertex buffer is unexpectedly NULL."); } // Invalidate static buffers that don't contain matching attributes @@ -106,9 +106,10 @@ GLenum VertexDataManager::prepareVertexData(const gl::VertexAttribute attribs[], { if (translated[i].active && attribs[i].enabled) { - if (!reserveSpaceForAttrib(attribs[i], currentValues[i], count, instances)) + gl::Error error = reserveSpaceForAttrib(attribs[i], currentValues[i], count, instances); + if (error.isError()) { - return GL_OUT_OF_MEMORY; + return error; } } } @@ -118,12 +119,14 @@ GLenum VertexDataManager::prepareVertexData(const gl::VertexAttribute attribs[], { if (translated[i].active) { - GLenum result; - if (attribs[i].enabled) { - result = storeAttribute(attribs[i], currentValues[i], &translated[i], - start, count, instances); + gl::Error error = storeAttribute(attribs[i], currentValues[i], &translated[i], + start, count, instances); + if (error.isError()) + { + return error; + } } else { @@ -132,14 +135,13 @@ GLenum VertexDataManager::prepareVertexData(const gl::VertexAttribute attribs[], mCurrentValueBuffer[i] = new StreamingVertexBufferInterface(mRenderer, CONSTANT_VERTEX_BUFFER_SIZE); } - result = storeCurrentValue(attribs[i], currentValues[i], &translated[i], - &mCurrentValue[i], &mCurrentValueOffsets[i], - mCurrentValueBuffer[i]); - } - - if (result != GL_NO_ERROR) - { - return result; + gl::Error error = storeCurrentValue(attribs[i], currentValues[i], &translated[i], + &mCurrentValue[i], &mCurrentValueOffsets[i], + mCurrentValueBuffer[i]); + if (error.isError()) + { + return error; + } } } } @@ -158,7 +160,7 @@ GLenum VertexDataManager::prepareVertexData(const gl::VertexAttribute attribs[], } } - return GL_NO_ERROR; + return gl::Error(GL_NO_ERROR); } void VertexDataManager::invalidateMatchingStaticData(const gl::VertexAttribute &attrib, @@ -181,10 +183,10 @@ void VertexDataManager::invalidateMatchingStaticData(const gl::VertexAttribute & } } -bool VertexDataManager::reserveSpaceForAttrib(const gl::VertexAttribute &attrib, - const gl::VertexAttribCurrentValueData ¤tValue, - GLsizei count, - GLsizei instances) const +gl::Error VertexDataManager::reserveSpaceForAttrib(const gl::VertexAttribute &attrib, + const gl::VertexAttribCurrentValueData ¤tValue, + GLsizei count, + GLsizei instances) const { gl::Buffer *buffer = attrib.buffer.get(); BufferD3D *bufferImpl = buffer ? BufferD3D::makeBufferD3D(buffer->getImplementation()) : NULL; @@ -198,9 +200,10 @@ bool VertexDataManager::reserveSpaceForAttrib(const gl::VertexAttribute &attrib, if (staticBuffer->getBufferSize() == 0) { int totalCount = ElementsInBuffer(attrib, bufferImpl->getSize()); - if (!staticBuffer->reserveVertexSpace(attrib, totalCount, 0)) + gl::Error error = staticBuffer->reserveVertexSpace(attrib, totalCount, 0); + if (error.isError()) { - return false; + return error; } } } @@ -209,22 +212,23 @@ bool VertexDataManager::reserveSpaceForAttrib(const gl::VertexAttribute &attrib, int totalCount = StreamingBufferElementCount(attrib, count, instances); ASSERT(!bufferImpl || ElementsInBuffer(attrib, bufferImpl->getSize()) >= totalCount); - if (!mStreamingBuffer->reserveVertexSpace(attrib, totalCount, instances)) + gl::Error error = mStreamingBuffer->reserveVertexSpace(attrib, totalCount, instances); + if (error.isError()) { - return false; + return error; } } } - return true; + return gl::Error(GL_NO_ERROR); } -GLenum VertexDataManager::storeAttribute(const gl::VertexAttribute &attrib, - const gl::VertexAttribCurrentValueData ¤tValue, - TranslatedAttribute *translated, - GLint start, - GLsizei count, - GLsizei instances) +gl::Error VertexDataManager::storeAttribute(const gl::VertexAttribute &attrib, + const gl::VertexAttribCurrentValueData ¤tValue, + TranslatedAttribute *translated, + GLint start, + GLsizei count, + GLsizei instances) { gl::Buffer *buffer = attrib.buffer.get(); ASSERT(buffer || attrib.pointer); @@ -244,9 +248,10 @@ GLenum VertexDataManager::storeAttribute(const gl::VertexAttribute &attrib, } else if (staticBuffer) { - if (!staticBuffer->getVertexBuffer()->getSpaceRequired(attrib, 1, 0, &outputElementSize)) + gl::Error error = staticBuffer->getVertexBuffer()->getSpaceRequired(attrib, 1, 0, &outputElementSize); + if (error.isError()) { - return GL_OUT_OF_MEMORY; + return error; } if (!staticBuffer->lookupAttribute(attrib, &streamOffset)) @@ -255,10 +260,11 @@ GLenum VertexDataManager::storeAttribute(const gl::VertexAttribute &attrib, int totalCount = ElementsInBuffer(attrib, storage->getSize()); int startIndex = attrib.offset / ComputeVertexAttributeStride(attrib); - if (!staticBuffer->storeVertexAttributes(attrib, currentValue, -startIndex, totalCount, - 0, &streamOffset)) + gl::Error error = staticBuffer->storeVertexAttributes(attrib, currentValue, -startIndex, totalCount, + 0, &streamOffset); + if (error.isError()) { - return GL_OUT_OF_MEMORY; + return error; } } @@ -266,7 +272,7 @@ GLenum VertexDataManager::storeAttribute(const gl::VertexAttribute &attrib, unsigned int startOffset = (instances == 0 || attrib.divisor == 0) ? start * outputElementSize : 0; if (streamOffset + firstElementOffset + startOffset < streamOffset) { - return GL_OUT_OF_MEMORY; + return gl::Error(GL_OUT_OF_MEMORY); } streamOffset += firstElementOffset + startOffset; @@ -274,11 +280,16 @@ GLenum VertexDataManager::storeAttribute(const gl::VertexAttribute &attrib, else { int totalCount = StreamingBufferElementCount(attrib, count, instances); - if (!mStreamingBuffer->getVertexBuffer()->getSpaceRequired(attrib, 1, 0, &outputElementSize) || - !mStreamingBuffer->storeVertexAttributes(attrib, currentValue, start, totalCount, instances, - &streamOffset)) + gl::Error error = mStreamingBuffer->getVertexBuffer()->getSpaceRequired(attrib, 1, 0, &outputElementSize); + if (error.isError()) { - return GL_OUT_OF_MEMORY; + return error; + } + + error = mStreamingBuffer->storeVertexAttributes(attrib, currentValue, start, totalCount, instances, &streamOffset); + if (error.isError()) + { + return error; } } @@ -292,27 +303,29 @@ GLenum VertexDataManager::storeAttribute(const gl::VertexAttribute &attrib, translated->stride = outputElementSize; translated->offset = streamOffset; - return GL_NO_ERROR; + return gl::Error(GL_NO_ERROR); } -GLenum VertexDataManager::storeCurrentValue(const gl::VertexAttribute &attrib, - const gl::VertexAttribCurrentValueData ¤tValue, - TranslatedAttribute *translated, - gl::VertexAttribCurrentValueData *cachedValue, - size_t *cachedOffset, - StreamingVertexBufferInterface *buffer) +gl::Error VertexDataManager::storeCurrentValue(const gl::VertexAttribute &attrib, + const gl::VertexAttribCurrentValueData ¤tValue, + TranslatedAttribute *translated, + gl::VertexAttribCurrentValueData *cachedValue, + size_t *cachedOffset, + StreamingVertexBufferInterface *buffer) { if (*cachedValue != currentValue) { - if (!buffer->reserveVertexSpace(attrib, 1, 0)) + gl::Error error = buffer->reserveVertexSpace(attrib, 1, 0); + if (error.isError()) { - return GL_OUT_OF_MEMORY; + return error; } unsigned int streamOffset; - if (!buffer->storeVertexAttributes(attrib, currentValue, 0, 1, 0, &streamOffset)) + error = buffer->storeVertexAttributes(attrib, currentValue, 0, 1, 0, &streamOffset); + if (error.isError()) { - return GL_OUT_OF_MEMORY; + return error; } *cachedValue = currentValue; @@ -329,7 +342,7 @@ GLenum VertexDataManager::storeCurrentValue(const gl::VertexAttribute &attrib, translated->stride = 0; translated->offset = *cachedOffset; - return GL_NO_ERROR; + return gl::Error(GL_NO_ERROR); } } diff --git a/src/libGLESv2/renderer/d3d/VertexDataManager.h b/src/libGLESv2/renderer/d3d/VertexDataManager.h index 9b27a44b..77287222 100644 --- a/src/libGLESv2/renderer/d3d/VertexDataManager.h +++ b/src/libGLESv2/renderer/d3d/VertexDataManager.h @@ -52,33 +52,33 @@ class VertexDataManager VertexDataManager(rx::Renderer *renderer); virtual ~VertexDataManager(); - GLenum prepareVertexData(const gl::VertexAttribute attribs[], const gl::VertexAttribCurrentValueData currentValues[], - gl::ProgramBinary *programBinary, GLint start, GLsizei count, TranslatedAttribute *outAttribs, GLsizei instances); + gl::Error prepareVertexData(const gl::VertexAttribute attribs[], const gl::VertexAttribCurrentValueData currentValues[], + gl::ProgramBinary *programBinary, GLint start, GLsizei count, TranslatedAttribute *outAttribs, GLsizei instances); private: DISALLOW_COPY_AND_ASSIGN(VertexDataManager); - bool reserveSpaceForAttrib(const gl::VertexAttribute &attrib, - const gl::VertexAttribCurrentValueData ¤tValue, - GLsizei count, - GLsizei instances) const; + gl::Error reserveSpaceForAttrib(const gl::VertexAttribute &attrib, + const gl::VertexAttribCurrentValueData ¤tValue, + GLsizei count, + GLsizei instances) const; void invalidateMatchingStaticData(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue) const; - GLenum storeAttribute(const gl::VertexAttribute &attrib, - const gl::VertexAttribCurrentValueData ¤tValue, - TranslatedAttribute *translated, - GLint start, - GLsizei count, - GLsizei instances); - - GLenum storeCurrentValue(const gl::VertexAttribute &attrib, + gl::Error storeAttribute(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, TranslatedAttribute *translated, - gl::VertexAttribCurrentValueData *cachedValue, - size_t *cachedOffset, - StreamingVertexBufferInterface *buffer); + GLint start, + GLsizei count, + GLsizei instances); + + gl::Error storeCurrentValue(const gl::VertexAttribute &attrib, + const gl::VertexAttribCurrentValueData ¤tValue, + TranslatedAttribute *translated, + gl::VertexAttribCurrentValueData *cachedValue, + size_t *cachedOffset, + StreamingVertexBufferInterface *buffer); rx::Renderer *const mRenderer; diff --git a/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp index c612ddd0..43ce5ba8 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp +++ b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp @@ -233,6 +233,17 @@ void *Buffer11::getData() mReadUsageCount = 0; + // Only happens if we initialized the buffer with no data (NULL) + if (mResolvedData.empty()) + { + if (!mResolvedData.resize(mSize)) + { + return gl::error(GL_OUT_OF_MEMORY, (void*)NULL); + } + } + + ASSERT(mResolvedData.size() >= mSize); + return mResolvedData.data(); } diff --git a/src/libGLESv2/renderer/d3d/d3d11/Image11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Image11.cpp index 185bd9c0..7536713a 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/Image11.cpp +++ b/src/libGLESv2/renderer/d3d/d3d11/Image11.cpp @@ -99,27 +99,27 @@ bool Image11::isDirty() const return mDirty; } -bool Image11::copyToStorage(TextureStorageInterface2D *storage, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height) +bool Image11::copyToStorage2D(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height) { - TextureStorage11_2D *storage11 = TextureStorage11_2D::makeTextureStorage11_2D(storage->getStorageInstance()); + TextureStorage11_2D *storage11 = TextureStorage11_2D::makeTextureStorage11_2D(storage); return copyToStorageImpl(storage11, level, 0, xoffset, yoffset, width, height); } -bool Image11::copyToStorage(TextureStorageInterfaceCube *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height) +bool Image11::copyToStorageCube(TextureStorage *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height) { - TextureStorage11_Cube *storage11 = TextureStorage11_Cube::makeTextureStorage11_Cube(storage->getStorageInstance()); + TextureStorage11_Cube *storage11 = TextureStorage11_Cube::makeTextureStorage11_Cube(storage); return copyToStorageImpl(storage11, level, face, xoffset, yoffset, width, height); } -bool Image11::copyToStorage(TextureStorageInterface3D *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth) +bool Image11::copyToStorage3D(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth) { - TextureStorage11_3D *storage11 = TextureStorage11_3D::makeTextureStorage11_3D(storage->getStorageInstance()); + TextureStorage11_3D *storage11 = TextureStorage11_3D::makeTextureStorage11_3D(storage); return copyToStorageImpl(storage11, level, 0, xoffset, yoffset, width, height); } -bool Image11::copyToStorage(TextureStorageInterface2DArray *storage, int level, GLint xoffset, GLint yoffset, GLint arrayLayer, GLsizei width, GLsizei height) +bool Image11::copyToStorage2DArray(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLint arrayLayer, GLsizei width, GLsizei height) { - TextureStorage11_2DArray *storage11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(storage->getStorageInstance()); + TextureStorage11_2DArray *storage11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(storage); return copyToStorageImpl(storage11, level, arrayLayer, xoffset, yoffset, width, height); } diff --git a/src/libGLESv2/renderer/d3d/d3d11/Image11.h b/src/libGLESv2/renderer/d3d/d3d11/Image11.h index c815eaf4..a76a61f0 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/Image11.h +++ b/src/libGLESv2/renderer/d3d/d3d11/Image11.h @@ -23,8 +23,6 @@ namespace rx { class Renderer; class Renderer11; -class TextureStorageInterface2D; -class TextureStorageInterfaceCube; class TextureStorage11; class Image11 : public ImageD3D @@ -39,10 +37,10 @@ class Image11 : public ImageD3D virtual bool isDirty() const; - virtual bool copyToStorage(TextureStorageInterface2D *storage, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); - virtual bool copyToStorage(TextureStorageInterfaceCube *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); - virtual bool copyToStorage(TextureStorageInterface3D *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); - virtual bool copyToStorage(TextureStorageInterface2DArray *storage, int level, GLint xoffset, GLint yoffset, GLint arrayLayer, GLsizei width, GLsizei height); + virtual bool copyToStorage2D(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); + virtual bool copyToStorageCube(TextureStorage *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); + virtual bool copyToStorage3D(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); + virtual bool copyToStorage2DArray(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLint arrayLayer, GLsizei width, GLsizei height); virtual bool redefine(Renderer *renderer, GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease); diff --git a/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp b/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp index b06526eb..b006c044 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp +++ b/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp @@ -85,16 +85,15 @@ void InputLayoutCache::markDirty() } } -GLenum InputLayoutCache::applyVertexBuffers(TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS], - gl::ProgramBinary *programBinary) +gl::Error InputLayoutCache::applyVertexBuffers(TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS], + gl::ProgramBinary *programBinary) { int sortedSemanticIndices[gl::MAX_VERTEX_ATTRIBS]; programBinary->sortAttributesByLayout(attributes, sortedSemanticIndices); if (!mDevice || !mDeviceContext) { - ERR("InputLayoutCache is not initialized."); - return GL_INVALID_OPERATION; + return gl::Error(GL_OUT_OF_MEMORY, "Internal input layout cache is not initialized."); } InputLayoutKey ilKey = { 0 }; @@ -149,8 +148,7 @@ GLenum InputLayoutCache::applyVertexBuffers(TranslatedAttribute attributes[gl::M HRESULT result = mDevice->CreateInputLayout(descs, ilKey.elementCount, shader->getFunction(), shader->getLength(), &inputLayout); if (FAILED(result)) { - ERR("Failed to crate input layout, result: 0x%08x", result); - return GL_INVALID_OPERATION; + return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal input layout, HRESULT: 0x%08x", result); } if (mInputLayoutMap.size() >= kMaxInputLayouts) @@ -222,7 +220,7 @@ GLenum InputLayoutCache::applyVertexBuffers(TranslatedAttribute attributes[gl::M mCurrentVertexStrides + minDiff, mCurrentVertexOffsets + minDiff); } - return GL_NO_ERROR; + return gl::Error(GL_NO_ERROR); } std::size_t InputLayoutCache::hashInputLayout(const InputLayoutKey &inputLayout) diff --git a/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.h b/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.h index 8a64c5a2..cc71ac3f 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.h +++ b/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.h @@ -11,6 +11,7 @@ #define LIBGLESV2_RENDERER_INPUTLAYOUTCACHE_H_ #include "libGLESv2/Constants.h" +#include "libGLESv2/Error.h" #include "common/angleutils.h" #include <GLES2/gl2.h> @@ -37,8 +38,8 @@ class InputLayoutCache void clear(); void markDirty(); - GLenum applyVertexBuffers(TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS], - gl::ProgramBinary *programBinary); + gl::Error applyVertexBuffers(TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS], + gl::ProgramBinary *programBinary); private: DISALLOW_COPY_AND_ASSIGN(InputLayoutCache); diff --git a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp index 753a4cae..c93def8b 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp +++ b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp @@ -315,6 +315,17 @@ void Renderer11::initializeDevice() ASSERT(!mPixelTransfer); mPixelTransfer = new PixelTransfer11(this); + const gl::Caps &rendererCaps = getRendererCaps(); + + mForceSetVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits); + mCurVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits); + + mForceSetPixelSamplerStates.resize(rendererCaps.maxTextureImageUnits); + mCurPixelSamplerStates.resize(rendererCaps.maxTextureImageUnits); + + mCurVertexSRVs.resize(rendererCaps.maxVertexTextureImageUnits); + mCurPixelSRVs.resize(rendererCaps.maxTextureImageUnits); + markAllStateDirty(); } @@ -324,7 +335,7 @@ int Renderer11::generateConfigs(ConfigDesc **configDescList) unsigned int numDepthFormats = ArraySize(DepthStencilFormats); (*configDescList) = new ConfigDesc[numRenderFormats * numDepthFormats]; int numConfigs = 0; - + for (unsigned int formatIndex = 0; formatIndex < numRenderFormats; formatIndex++) { const d3d11::DXGIFormat &renderTargetFormatInfo = d3d11::GetDXGIFormatInfo(RenderTargetFormats[formatIndex]); @@ -406,10 +417,10 @@ void Renderer11::generateSwizzle(gl::Texture *texture) { if (texture) { - TextureStorageInterface *texStorage = texture->getNativeTexture(); + TextureStorage *texStorage = texture->getNativeTexture(); if (texStorage) { - TextureStorage11 *storage11 = TextureStorage11::makeTextureStorage11(texStorage->getStorageInstance()); + TextureStorage11 *storage11 = TextureStorage11::makeTextureStorage11(texStorage); storage11->generateSwizzles(texture->getSamplerState().swizzleRed, texture->getSamplerState().swizzleGreen, @@ -477,10 +488,10 @@ void Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *textur { TextureD3D* textureImpl = TextureD3D::makeTextureD3D(texture->getImplementation()); - TextureStorageInterface *texStorage = textureImpl->getNativeTexture(); + TextureStorage *texStorage = textureImpl->getNativeTexture(); if (texStorage) { - TextureStorage11 *storage11 = TextureStorage11::makeTextureStorage11(texStorage->getStorageInstance()); + TextureStorage11 *storage11 = TextureStorage11::makeTextureStorage11(texStorage); gl::SamplerState samplerState; texture->getSamplerStateWithNativeOffset(&samplerState); textureSRV = storage11->getSRV(samplerState); @@ -697,7 +708,7 @@ void Renderer11::setScissorRectangle(const gl::Rectangle &scissor, bool enabled) mForceSetScissor = false; } -bool Renderer11::setViewport(const gl::Rectangle &viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace, +void Renderer11::setViewport(const gl::Rectangle &viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace, bool ignoreViewport) { gl::Rectangle actualViewport = viewport; @@ -724,11 +735,6 @@ bool Renderer11::setViewport(const gl::Rectangle &viewport, float zNear, float z dxViewport.MinDepth = actualZNear; dxViewport.MaxDepth = actualZFar; - if (dxViewport.Width <= 0 || dxViewport.Height <= 0) - { - return false; // Nothing to render - } - bool viewportChanged = mForceSetViewport || memcmp(&actualViewport, &mCurViewport, sizeof(gl::Rectangle)) != 0 || actualZNear != mCurNear || actualZFar != mCurFar; @@ -758,7 +764,6 @@ bool Renderer11::setViewport(const gl::Rectangle &viewport, float zNear, float z } mForceSetViewport = false; - return true; } bool Renderer11::applyPrimitiveType(GLenum mode, GLsizei count) @@ -928,14 +933,14 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer) return true; } -GLenum Renderer11::applyVertexBuffer(gl::ProgramBinary *programBinary, const gl::VertexAttribute vertexAttributes[], const gl::VertexAttribCurrentValueData currentValues[], - GLint first, GLsizei count, GLsizei instances) +gl::Error Renderer11::applyVertexBuffer(gl::ProgramBinary *programBinary, const gl::VertexAttribute vertexAttributes[], const gl::VertexAttribCurrentValueData currentValues[], + GLint first, GLsizei count, GLsizei instances) { TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS]; - GLenum err = mVertexDataManager->prepareVertexData(vertexAttributes, currentValues, programBinary, first, count, attributes, instances); - if (err != GL_NO_ERROR) + gl::Error error = mVertexDataManager->prepareVertexData(vertexAttributes, currentValues, programBinary, first, count, attributes, instances); + if (error.isError()) { - return err; + return error; } return mInputLayoutCache.applyVertexBuffers(attributes, programBinary); @@ -1562,15 +1567,18 @@ void Renderer11::markAllStateDirty() mDepthStencilInitialized = false; mRenderTargetDescInitialized = false; - for (int i = 0; i < gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS; i++) + ASSERT(mForceSetVertexSamplerStates.size() == mCurVertexSRVs.size()); + for (size_t vsamplerId = 0; vsamplerId < mForceSetVertexSamplerStates.size(); ++vsamplerId) { - mForceSetVertexSamplerStates[i] = true; - mCurVertexSRVs[i] = NULL; + mForceSetVertexSamplerStates[vsamplerId] = true; + mCurVertexSRVs[vsamplerId] = NULL; } - for (int i = 0; i < gl::MAX_TEXTURE_IMAGE_UNITS; i++) + + ASSERT(mForceSetPixelSamplerStates.size() == mCurPixelSRVs.size()); + for (size_t fsamplerId = 0; fsamplerId < mForceSetPixelSamplerStates.size(); ++fsamplerId) { - mForceSetPixelSamplerStates[i] = true; - mCurPixelSRVs[i] = NULL; + mForceSetPixelSamplerStates[fsamplerId] = true; + mCurPixelSRVs[fsamplerId] = NULL; } mForceSetBlendState = true; @@ -1865,12 +1873,12 @@ int Renderer11::getMaxSwapInterval() const return 4; } -bool Renderer11::copyToRenderTarget(TextureStorageInterface2D *dest, TextureStorageInterface2D *source) +bool Renderer11::copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source) { if (source && dest) { - TextureStorage11_2D *source11 = TextureStorage11_2D::makeTextureStorage11_2D(source->getStorageInstance()); - TextureStorage11_2D *dest11 = TextureStorage11_2D::makeTextureStorage11_2D(dest->getStorageInstance()); + TextureStorage11_2D *source11 = TextureStorage11_2D::makeTextureStorage11_2D(source); + TextureStorage11_2D *dest11 = TextureStorage11_2D::makeTextureStorage11_2D(dest); mDeviceContext->CopyResource(dest11->getResource(), source11->getResource()); @@ -1882,12 +1890,12 @@ bool Renderer11::copyToRenderTarget(TextureStorageInterface2D *dest, TextureStor return false; } -bool Renderer11::copyToRenderTarget(TextureStorageInterfaceCube *dest, TextureStorageInterfaceCube *source) +bool Renderer11::copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source) { if (source && dest) { - TextureStorage11_Cube *source11 = TextureStorage11_Cube::makeTextureStorage11_Cube(source->getStorageInstance()); - TextureStorage11_Cube *dest11 = TextureStorage11_Cube::makeTextureStorage11_Cube(dest->getStorageInstance()); + TextureStorage11_Cube *source11 = TextureStorage11_Cube::makeTextureStorage11_Cube(source); + TextureStorage11_Cube *dest11 = TextureStorage11_Cube::makeTextureStorage11_Cube(dest); mDeviceContext->CopyResource(dest11->getResource(), source11->getResource()); @@ -1899,12 +1907,12 @@ bool Renderer11::copyToRenderTarget(TextureStorageInterfaceCube *dest, TextureSt return false; } -bool Renderer11::copyToRenderTarget(TextureStorageInterface3D *dest, TextureStorageInterface3D *source) +bool Renderer11::copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source) { if (source && dest) { - TextureStorage11_3D *source11 = TextureStorage11_3D::makeTextureStorage11_3D(source->getStorageInstance()); - TextureStorage11_3D *dest11 = TextureStorage11_3D::makeTextureStorage11_3D(dest->getStorageInstance()); + TextureStorage11_3D *source11 = TextureStorage11_3D::makeTextureStorage11_3D(source); + TextureStorage11_3D *dest11 = TextureStorage11_3D::makeTextureStorage11_3D(dest); mDeviceContext->CopyResource(dest11->getResource(), source11->getResource()); @@ -1916,12 +1924,12 @@ bool Renderer11::copyToRenderTarget(TextureStorageInterface3D *dest, TextureStor return false; } -bool Renderer11::copyToRenderTarget(TextureStorageInterface2DArray *dest, TextureStorageInterface2DArray *source) +bool Renderer11::copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source) { if (source && dest) { - TextureStorage11_2DArray *source11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(source->getStorageInstance()); - TextureStorage11_2DArray *dest11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(dest->getStorageInstance()); + TextureStorage11_2DArray *source11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(source); + TextureStorage11_2DArray *dest11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(dest); mDeviceContext->CopyResource(dest11->getResource(), source11->getResource()); @@ -1933,8 +1941,8 @@ bool Renderer11::copyToRenderTarget(TextureStorageInterface2DArray *dest, Textur return false; } -bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, TextureStorageInterface2D *storage, GLint level) +bool Renderer11::copyImage2D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level) { gl::FramebufferAttachment *colorbuffer = framebuffer->getReadColorbuffer(); if (!colorbuffer) @@ -1957,14 +1965,15 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so return gl::error(GL_OUT_OF_MEMORY, false); } - TextureStorage11_2D *storage11 = TextureStorage11_2D::makeTextureStorage11_2D(storage->getStorageInstance()); + TextureStorage11_2D *storage11 = TextureStorage11_2D::makeTextureStorage11_2D(storage); if (!storage11) { ERR("Failed to retrieve the texture storage from the destination."); return gl::error(GL_OUT_OF_MEMORY, false); } - RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTarget(level)); + gl::ImageIndex index = gl::ImageIndex::Make2D(level); + RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTarget(index)); if (!destRenderTarget) { ERR("Failed to retrieve the render target from the destination storage."); @@ -1994,8 +2003,8 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so return ret; } -bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, TextureStorageInterfaceCube *storage, GLenum target, GLint level) +bool Renderer11::copyImageCube(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, TextureStorage *storage, GLenum target, GLint level) { gl::FramebufferAttachment *colorbuffer = framebuffer->getReadColorbuffer(); if (!colorbuffer) @@ -2018,14 +2027,15 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so return gl::error(GL_OUT_OF_MEMORY, false); } - TextureStorage11_Cube *storage11 = TextureStorage11_Cube::makeTextureStorage11_Cube(storage->getStorageInstance()); + TextureStorage11_Cube *storage11 = TextureStorage11_Cube::makeTextureStorage11_Cube(storage); if (!storage11) { ERR("Failed to retrieve the texture storage from the destination."); return gl::error(GL_OUT_OF_MEMORY, false); } - RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTargetFace(target, level)); + gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level); + RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTarget(index)); if (!destRenderTarget) { ERR("Failed to retrieve the render target from the destination storage."); @@ -2055,8 +2065,8 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so return ret; } -bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, GLint zOffset, TextureStorageInterface3D *storage, GLint level) +bool Renderer11::copyImage3D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, GLint zOffset, TextureStorage *storage, GLint level) { gl::FramebufferAttachment *colorbuffer = framebuffer->getReadColorbuffer(); if (!colorbuffer) @@ -2079,14 +2089,15 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so return gl::error(GL_OUT_OF_MEMORY, false); } - TextureStorage11_3D *storage11 = TextureStorage11_3D::makeTextureStorage11_3D(storage->getStorageInstance()); + TextureStorage11_3D *storage11 = TextureStorage11_3D::makeTextureStorage11_3D(storage); if (!storage11) { ERR("Failed to retrieve the texture storage from the destination."); return gl::error(GL_OUT_OF_MEMORY, false); } - RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTargetLayer(level, zOffset)); + gl::ImageIndex index = gl::ImageIndex::Make3D(level, zOffset); + RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTarget(index)); if (!destRenderTarget) { ERR("Failed to retrieve the render target from the destination storage."); @@ -2116,8 +2127,8 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so return ret; } -bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, GLint zOffset, TextureStorageInterface2DArray *storage, GLint level) +bool Renderer11::copyImage2DArray(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, GLint zOffset, TextureStorage *storage, GLint level) { gl::FramebufferAttachment *colorbuffer = framebuffer->getReadColorbuffer(); if (!colorbuffer) @@ -2140,7 +2151,7 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so return gl::error(GL_OUT_OF_MEMORY, false); } - TextureStorage11_2DArray *storage11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(storage->getStorageInstance()); + TextureStorage11_2DArray *storage11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(storage); if (!storage11) { SafeRelease(source); @@ -2148,7 +2159,8 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so return gl::error(GL_OUT_OF_MEMORY, false); } - RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTargetLayer(level, zOffset)); + gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, zOffset); + RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTarget(index)); if (!destRenderTarget) { SafeRelease(source); @@ -3103,7 +3115,7 @@ void Renderer11::invalidateFBOAttachmentSwizzles(gl::FramebufferAttachment *atta ASSERT(attachment->isTexture()); gl::Texture *texture = attachment->getTexture(); - TextureStorage *texStorage = texture->getNativeTexture()->getStorageInstance(); + TextureStorage *texStorage = texture->getNativeTexture(); if (texStorage) { TextureStorage11 *texStorage11 = TextureStorage11::makeTextureStorage11(texStorage); diff --git a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h index ae6d2845..19e27477 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h +++ b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h @@ -72,7 +72,7 @@ class Renderer11 : public Renderer int stencilBackRef, bool frontFaceCCW); virtual void setScissorRectangle(const gl::Rectangle &scissor, bool enabled); - virtual bool setViewport(const gl::Rectangle &viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace, + virtual void setViewport(const gl::Rectangle &viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace, bool ignoreViewport); virtual bool applyPrimitiveType(GLenum mode, GLsizei count); @@ -80,8 +80,8 @@ class Renderer11 : public Renderer virtual void applyShaders(gl::ProgramBinary *programBinary, const gl::VertexFormat inputLayout[], const gl::Framebuffer *framebuffer, bool rasterizerDiscard, bool transformFeedbackActive); virtual void applyUniforms(const gl::ProgramBinary &programBinary); - virtual GLenum applyVertexBuffer(gl::ProgramBinary *programBinary, const gl::VertexAttribute vertexAttributes[], const gl::VertexAttribCurrentValueData currentValues[], - GLint first, GLsizei count, GLsizei instances); + virtual gl::Error applyVertexBuffer(gl::ProgramBinary *programBinary, const gl::VertexAttribute vertexAttributes[], const gl::VertexAttribCurrentValueData currentValues[], + GLint first, GLsizei count, GLsizei instances); virtual gl::Error applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo); virtual void applyTransformFeedbackBuffers(gl::Buffer *transformFeedbackBuffers[], GLintptr offsets[]); @@ -115,19 +115,19 @@ class Renderer11 : public Renderer virtual int getMaxSwapInterval() const; // Pixel operations - virtual bool copyToRenderTarget(TextureStorageInterface2D *dest, TextureStorageInterface2D *source); - virtual bool copyToRenderTarget(TextureStorageInterfaceCube *dest, TextureStorageInterfaceCube *source); - virtual bool copyToRenderTarget(TextureStorageInterface3D *dest, TextureStorageInterface3D *source); - virtual bool copyToRenderTarget(TextureStorageInterface2DArray *dest, TextureStorageInterface2DArray *source); - - virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, TextureStorageInterface2D *storage, GLint level); - virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, TextureStorageInterfaceCube *storage, GLenum target, GLint level); - virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, GLint zOffset, TextureStorageInterface3D *storage, GLint level); - virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, GLint zOffset, TextureStorageInterface2DArray *storage, GLint level); + virtual bool copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source); + virtual bool copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source); + virtual bool copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source); + virtual bool copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source); + + virtual bool copyImage2D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level); + virtual bool copyImageCube(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, TextureStorage *storage, GLenum target, GLint level); + virtual bool copyImage3D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, GLint zOffset, TextureStorage *storage, GLint level); + virtual bool copyImage2DArray(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, GLint zOffset, TextureStorage *storage, GLint level); virtual bool blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget, const gl::Rectangle &drawRect, const gl::Rectangle *scissor, bool blitRenderTarget, bool blitDepth, bool blitStencil, GLenum filter); @@ -245,15 +245,15 @@ class Renderer11 : public Renderer rx::RenderTarget::Desc mRenderTargetDesc; // Currently applied sampler states - bool mForceSetVertexSamplerStates[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; - gl::SamplerState mCurVertexSamplerStates[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; + std::vector<bool> mForceSetVertexSamplerStates; + std::vector<gl::SamplerState> mCurVertexSamplerStates; - bool mForceSetPixelSamplerStates[gl::MAX_TEXTURE_IMAGE_UNITS]; - gl::SamplerState mCurPixelSamplerStates[gl::MAX_TEXTURE_IMAGE_UNITS]; + std::vector<bool> mForceSetPixelSamplerStates; + std::vector<gl::SamplerState> mCurPixelSamplerStates; // Currently applied textures - ID3D11ShaderResourceView *mCurVertexSRVs[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; - ID3D11ShaderResourceView *mCurPixelSRVs[gl::MAX_TEXTURE_IMAGE_UNITS]; + std::vector<ID3D11ShaderResourceView*> mCurVertexSRVs; + std::vector<ID3D11ShaderResourceView*> mCurPixelSRVs; // Currently applied blend state bool mForceSetBlendState; diff --git a/src/libGLESv2/renderer/d3d/d3d11/TextureStorage11.cpp b/src/libGLESv2/renderer/d3d/d3d11/TextureStorage11.cpp index 10a5e7e5..c012637b 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/TextureStorage11.cpp +++ b/src/libGLESv2/renderer/d3d/d3d11/TextureStorage11.cpp @@ -17,6 +17,7 @@ #include "libGLESv2/renderer/d3d/d3d11/Image11.h" #include "libGLESv2/renderer/d3d/TextureD3D.h" #include "libGLESv2/main.h" +#include "libGLESv2/ImageIndex.h" #include "common/utilities.h" @@ -395,11 +396,11 @@ void TextureStorage11::verifySwizzleExists(GLenum swizzleRed, GLenum swizzleGree } TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapchain) - : TextureStorage11(renderer, D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE) + : TextureStorage11(renderer, D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE), + mTexture(swapchain->getOffscreenTexture()), + mSwizzleTexture(NULL) { - mTexture = swapchain->getOffscreenTexture(); mTexture->AddRef(); - mSwizzleTexture = NULL; for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) { @@ -433,14 +434,15 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapch mSwizzleRenderTargetFormat = formatInfo.swizzleRTVFormat; mDepthStencilFormat = DXGI_FORMAT_UNKNOWN; + + initializeSerials(1, 1); } TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels) - : TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderTarget)) + : TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderTarget)), + mTexture(NULL), + mSwizzleTexture(NULL) { - mTexture = NULL; - mSwizzleTexture = NULL; - for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) { mAssociatedImages[i] = NULL; @@ -502,6 +504,8 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, GLenum internalform mTextureDepth = 1; } } + + initializeSerials(getLevelCount(), 1); } TextureStorage11_2D::~TextureStorage11_2D() @@ -605,8 +609,12 @@ ID3D11Resource *TextureStorage11_2D::getResource() const return mTexture; } -RenderTarget *TextureStorage11_2D::getRenderTarget(int level) +RenderTarget *TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index) { + ASSERT(!index.hasLayer()); + + int level = index.mipIndex; + if (level >= 0 && level < getLevelCount()) { if (!mRenderTarget[level]) @@ -701,14 +709,22 @@ ID3D11ShaderResourceView *TextureStorage11_2D::createSRV(int baseLevel, int mipL return SRV; } -void TextureStorage11_2D::generateMipmap(int level) +void TextureStorage11_2D::generateMipmaps() { - invalidateSwizzleCacheLevel(level); + // Base level must already be defined + + for (int level = 1; level < getLevelCount(); level++) + { + invalidateSwizzleCacheLevel(level); + + gl::ImageIndex srcIndex = gl::ImageIndex::Make2D(level - 1); + gl::ImageIndex destIndex = gl::ImageIndex::Make2D(level); - RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(level - 1)); - RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(level)); + RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(srcIndex)); + RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(destIndex)); - generateMipmapLayer(source, dest); + generateMipmapLayer(source, dest); + } } ID3D11Resource *TextureStorage11_2D::getSwizzleTexture() @@ -777,11 +793,6 @@ ID3D11RenderTargetView *TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel } } -unsigned int TextureStorage11_2D::getTextureLevelDepth(int mipLevel) const -{ - return 1; -} - TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, GLenum internalformat, bool renderTarget, int size, int levels) : TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderTarget)) { @@ -847,8 +858,11 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, GLenum internal mTextureDepth = 1; } } + + initializeSerials(getLevelCount() * 6, 6); } + TextureStorage11_Cube::~TextureStorage11_Cube() { for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) @@ -971,11 +985,13 @@ ID3D11Resource *TextureStorage11_Cube::getResource() const return mTexture; } -RenderTarget *TextureStorage11_Cube::getRenderTargetFace(GLenum faceTarget, int level) +RenderTarget *TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index) { + int faceIndex = index.layerIndex; + int level = index.mipIndex; + if (level >= 0 && level < getLevelCount()) { - int faceIndex = gl::TextureCubeMap::targetToLayerIndex(faceTarget); if (!mRenderTarget[faceIndex][level]) { ID3D11Device *device = mRenderer->getDevice(); @@ -1099,14 +1115,25 @@ ID3D11ShaderResourceView *TextureStorage11_Cube::createSRV(int baseLevel, int mi return SRV; } -void TextureStorage11_Cube::generateMipmap(int faceIndex, int level) +void TextureStorage11_Cube::generateMipmaps() { - invalidateSwizzleCacheLevel(level); + // Base level must already be defined + + for (int faceIndex = 0; faceIndex < 6; faceIndex++) + { + for (int level = 1; level < getLevelCount(); level++) + { + invalidateSwizzleCacheLevel(level); + + gl::ImageIndex srcIndex = gl::ImageIndex::MakeCube(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level - 1); + gl::ImageIndex destIndex = gl::ImageIndex::MakeCube(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level); - RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTargetFace(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level - 1)); - RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTargetFace(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level)); + RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(srcIndex)); + RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(destIndex)); - generateMipmapLayer(source, dest); + generateMipmapLayer(source, dest); + } + } } ID3D11Resource *TextureStorage11_Cube::getSwizzleTexture() @@ -1178,11 +1205,6 @@ ID3D11RenderTargetView *TextureStorage11_Cube::getSwizzleRenderTarget(int mipLev } } -unsigned int TextureStorage11_Cube::getTextureLevelDepth(int mipLevel) const -{ - return 6; -} - TextureStorage11_3D::TextureStorage11_3D(Renderer *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels) : TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderTarget)) @@ -1249,6 +1271,8 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer *renderer, GLenum internalform mTextureDepth = desc.Depth; } } + + initializeSerials(getLevelCount() * depth, depth); } TextureStorage11_3D::~TextureStorage11_3D() @@ -1380,20 +1404,24 @@ ID3D11ShaderResourceView *TextureStorage11_3D::createSRV(int baseLevel, int mipL return SRV; } -RenderTarget *TextureStorage11_3D::getRenderTarget(int mipLevel) +RenderTarget *TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index) { + int mipLevel = index.mipIndex; + if (mipLevel >= 0 && mipLevel < getLevelCount()) { - if (!mLevelRenderTargets[mipLevel]) + ASSERT(mRenderTargetFormat != DXGI_FORMAT_UNKNOWN); + + if (!index.hasLayer()) { - ID3D11ShaderResourceView *srv = getSRVLevel(mipLevel); - if (!srv) + if (!mLevelRenderTargets[mipLevel]) { - return NULL; - } + ID3D11ShaderResourceView *srv = getSRVLevel(mipLevel); + if (!srv) + { + return NULL; + } - if (mRenderTargetFormat != DXGI_FORMAT_UNKNOWN) - { ID3D11Device *device = mRenderer->getDevice(); D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; @@ -1418,35 +1446,22 @@ RenderTarget *TextureStorage11_3D::getRenderTarget(int mipLevel) // RenderTarget will take ownership of these resources SafeRelease(rtv); } - else - { - UNREACHABLE(); - } - } - - return mLevelRenderTargets[mipLevel]; - } - else - { - return NULL; - } -} -RenderTarget *TextureStorage11_3D::getRenderTargetLayer(int mipLevel, int layer) -{ - if (mipLevel >= 0 && mipLevel < getLevelCount()) - { - LevelLayerKey key(mipLevel, layer); - if (mLevelLayerRenderTargets.find(key) == mLevelLayerRenderTargets.end()) + return mLevelRenderTargets[mipLevel]; + } + else { - ID3D11Device *device = mRenderer->getDevice(); - HRESULT result; + int layer = index.layerIndex; - // TODO, what kind of SRV is expected here? - ID3D11ShaderResourceView *srv = NULL; - - if (mRenderTargetFormat != DXGI_FORMAT_UNKNOWN) + LevelLayerKey key(mipLevel, layer); + if (mLevelLayerRenderTargets.find(key) == mLevelLayerRenderTargets.end()) { + ID3D11Device *device = mRenderer->getDevice(); + HRESULT result; + + // TODO, what kind of SRV is expected here? + ID3D11ShaderResourceView *srv = NULL; + D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; rtvDesc.Format = mRenderTargetFormat; rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; @@ -1470,28 +1485,30 @@ RenderTarget *TextureStorage11_3D::getRenderTargetLayer(int mipLevel, int layer) SafeRelease(rtv); SafeRelease(srv); } - else - { - UNREACHABLE(); - } - } - return mLevelLayerRenderTargets[key]; - } - else - { - return NULL; + return mLevelLayerRenderTargets[key]; + } } + + return NULL; } -void TextureStorage11_3D::generateMipmap(int level) +void TextureStorage11_3D::generateMipmaps() { - invalidateSwizzleCacheLevel(level); + // Base level must already be defined - RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(level - 1)); - RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(level)); + for (int level = 1; level < getLevelCount(); level++) + { + invalidateSwizzleCacheLevel(level); - generateMipmapLayer(source, dest); + gl::ImageIndex srcIndex = gl::ImageIndex::Make3D(level - 1); + gl::ImageIndex destIndex = gl::ImageIndex::Make3D(level); + + RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(srcIndex)); + RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(destIndex)); + + generateMipmapLayer(source, dest); + } } ID3D11Resource *TextureStorage11_3D::getSwizzleTexture() @@ -1561,12 +1578,6 @@ ID3D11RenderTargetView *TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel } } -unsigned int TextureStorage11_3D::getTextureLevelDepth(int mipLevel) const -{ - return std::max(mTextureDepth >> mipLevel, 1U); -} - - TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels) : TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderTarget)) @@ -1633,6 +1644,8 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer *renderer, GLenum in mTextureDepth = desc.ArraySize; } } + + initializeSerials(getLevelCount() * depth, depth); } TextureStorage11_2DArray::~TextureStorage11_2DArray() @@ -1760,8 +1773,13 @@ ID3D11ShaderResourceView *TextureStorage11_2DArray::createSRV(int baseLevel, int return SRV; } -RenderTarget *TextureStorage11_2DArray::getRenderTargetLayer(int mipLevel, int layer) +RenderTarget *TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index) { + ASSERT(index.hasLayer()); + + int mipLevel = index.mipIndex; + int layer = index.layerIndex; + if (mipLevel >= 0 && mipLevel < getLevelCount()) { LevelLayerKey key(mipLevel, layer); @@ -1826,15 +1844,23 @@ RenderTarget *TextureStorage11_2DArray::getRenderTargetLayer(int mipLevel, int l } } -void TextureStorage11_2DArray::generateMipmap(int level) +void TextureStorage11_2DArray::generateMipmaps() { - invalidateSwizzleCacheLevel(level); - for (unsigned int layer = 0; layer < mTextureDepth; layer++) + // Base level must already be defined + + for (int level = 0; level < getLevelCount(); level++) { - RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTargetLayer(level - 1, layer)); - RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTargetLayer(level, layer)); + invalidateSwizzleCacheLevel(level); + for (unsigned int layer = 0; layer < mTextureDepth; layer++) + { + gl::ImageIndex sourceIndex = gl::ImageIndex::Make2DArray(level - 1, layer); + gl::ImageIndex destIndex = gl::ImageIndex::Make2DArray(level, layer); - generateMipmapLayer(source, dest); + RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(sourceIndex)); + RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(destIndex)); + + generateMipmapLayer(source, dest); + } } } @@ -1907,9 +1933,4 @@ ID3D11RenderTargetView *TextureStorage11_2DArray::getSwizzleRenderTarget(int mip } } -unsigned int TextureStorage11_2DArray::getTextureLevelDepth(int mipLevel) const -{ - return mTextureDepth; -} - } diff --git a/src/libGLESv2/renderer/d3d/d3d11/TextureStorage11.h b/src/libGLESv2/renderer/d3d/d3d11/TextureStorage11.h index 76eeada5..da06aa6f 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/TextureStorage11.h +++ b/src/libGLESv2/renderer/d3d/d3d11/TextureStorage11.h @@ -15,6 +15,11 @@ #include <map> +namespace gl +{ +struct ImageIndex; +} + namespace rx { class RenderTarget; @@ -37,12 +42,9 @@ class TextureStorage11 : public TextureStorage virtual ID3D11Resource *getResource() const = 0; virtual ID3D11ShaderResourceView *getSRV(const gl::SamplerState &samplerState); - virtual RenderTarget *getRenderTarget(int level) { return NULL; } - virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level) { return NULL; } - virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer) { return NULL; } + virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0; - virtual void generateMipmap(int level) {}; - virtual void generateMipmap(int face, int level) {}; + virtual void generateMipmaps() = 0; virtual int getTopLevel() const; virtual bool isRenderTarget() const; @@ -82,8 +84,6 @@ class TextureStorage11 : public TextureStorage void verifySwizzleExists(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha); - virtual unsigned int getTextureLevelDepth(int mipLevel) const = 0; - Renderer11 *mRenderer; int mTopLevel; unsigned int mMipLevels; @@ -160,9 +160,9 @@ class TextureStorage11_2D : public TextureStorage11 static TextureStorage11_2D *makeTextureStorage11_2D(TextureStorage *storage); virtual ID3D11Resource *getResource() const; - virtual RenderTarget *getRenderTarget(int level); + virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); - virtual void generateMipmap(int level); + virtual void generateMipmaps(); virtual void associateImage(Image11* image, int level, int layerTarget); virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage); @@ -173,8 +173,6 @@ class TextureStorage11_2D : public TextureStorage11 virtual ID3D11Resource *getSwizzleTexture(); virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel); - virtual unsigned int getTextureLevelDepth(int mipLevel) const; - private: DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2D); @@ -198,9 +196,9 @@ class TextureStorage11_Cube : public TextureStorage11 static TextureStorage11_Cube *makeTextureStorage11_Cube(TextureStorage *storage); virtual ID3D11Resource *getResource() const; - virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level); + virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); - virtual void generateMipmap(int faceIndex, int level); + virtual void generateMipmaps(); virtual void associateImage(Image11* image, int level, int layerTarget); virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage); @@ -211,8 +209,6 @@ class TextureStorage11_Cube : public TextureStorage11 virtual ID3D11Resource *getSwizzleTexture(); virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel); - virtual unsigned int getTextureLevelDepth(int mipLevel) const; - private: DISALLOW_COPY_AND_ASSIGN(TextureStorage11_Cube); @@ -237,10 +233,11 @@ class TextureStorage11_3D : public TextureStorage11 static TextureStorage11_3D *makeTextureStorage11_3D(TextureStorage *storage); virtual ID3D11Resource *getResource() const; - virtual RenderTarget *getRenderTarget(int mipLevel); - virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer); - virtual void generateMipmap(int level); + // Handles both layer and non-layer RTs + virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); + + virtual void generateMipmaps(); virtual void associateImage(Image11* image, int level, int layerTarget); virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage); @@ -251,8 +248,6 @@ class TextureStorage11_3D : public TextureStorage11 virtual ID3D11Resource *getSwizzleTexture(); virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel); - virtual unsigned int getTextureLevelDepth(int mipLevel) const; - private: DISALLOW_COPY_AND_ASSIGN(TextureStorage11_3D); @@ -281,9 +276,9 @@ class TextureStorage11_2DArray : public TextureStorage11 static TextureStorage11_2DArray *makeTextureStorage11_2DArray(TextureStorage *storage); virtual ID3D11Resource *getResource() const; - virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer); + virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); - virtual void generateMipmap(int level); + virtual void generateMipmaps(); virtual void associateImage(Image11* image, int level, int layerTarget); virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage); @@ -294,8 +289,6 @@ class TextureStorage11_2DArray : public TextureStorage11 virtual ID3D11Resource *getSwizzleTexture(); virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel); - virtual unsigned int getTextureLevelDepth(int mipLevel) const; - private: DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2DArray); diff --git a/src/libGLESv2/renderer/d3d/d3d11/VertexBuffer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/VertexBuffer11.cpp index 51ea8e58..9bc5b1d2 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/VertexBuffer11.cpp +++ b/src/libGLESv2/renderer/d3d/d3d11/VertexBuffer11.cpp @@ -28,7 +28,7 @@ VertexBuffer11::~VertexBuffer11() SafeRelease(mBuffer); } -bool VertexBuffer11::initialize(unsigned int size, bool dynamicUsage) +gl::Error VertexBuffer11::initialize(unsigned int size, bool dynamicUsage) { SafeRelease(mBuffer); @@ -49,13 +49,14 @@ bool VertexBuffer11::initialize(unsigned int size, bool dynamicUsage) HRESULT result = dxDevice->CreateBuffer(&bufferDesc, NULL, &mBuffer); if (FAILED(result)) { - return false; + return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal vertex buffer of size, %lu.", size); } } mBufferSize = size; mDynamicUsage = dynamicUsage; - return true; + + return gl::Error(GL_NO_ERROR); } VertexBuffer11 *VertexBuffer11::makeVertexBuffer11(VertexBuffer *vetexBuffer) @@ -64,66 +65,62 @@ VertexBuffer11 *VertexBuffer11::makeVertexBuffer11(VertexBuffer *vetexBuffer) return static_cast<VertexBuffer11*>(vetexBuffer); } -bool VertexBuffer11::storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, - GLint start, GLsizei count, GLsizei instances, unsigned int offset) +gl::Error VertexBuffer11::storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, + GLint start, GLsizei count, GLsizei instances, unsigned int offset) { - if (mBuffer) + if (!mBuffer) { - gl::Buffer *buffer = attrib.buffer.get(); - int inputStride = ComputeVertexAttributeStride(attrib); - ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext(); + return gl::Error(GL_OUT_OF_MEMORY, "Internal vertex buffer is not initialized."); + } - D3D11_MAPPED_SUBRESOURCE mappedResource; - HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource); - if (FAILED(result)) - { - ERR("Vertex buffer map failed with error 0x%08x", result); - return false; - } + gl::Buffer *buffer = attrib.buffer.get(); + int inputStride = ComputeVertexAttributeStride(attrib); + ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext(); - uint8_t* output = reinterpret_cast<uint8_t*>(mappedResource.pData) + offset; + D3D11_MAPPED_SUBRESOURCE mappedResource; + HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource); + if (FAILED(result)) + { + return gl::Error(GL_OUT_OF_MEMORY, "Failed to map internal vertex buffer, HRESULT: 0x%08x.", result); + } + + uint8_t *output = reinterpret_cast<uint8_t*>(mappedResource.pData) + offset; - const uint8_t *input = NULL; - if (attrib.enabled) + const uint8_t *input = NULL; + if (attrib.enabled) + { + if (buffer) { - if (buffer) - { - Buffer11 *storage = Buffer11::makeBuffer11(buffer->getImplementation()); - input = static_cast<const uint8_t*>(storage->getData()) + static_cast<int>(attrib.offset); - } - else - { - input = static_cast<const uint8_t*>(attrib.pointer); - } + Buffer11 *storage = Buffer11::makeBuffer11(buffer->getImplementation()); + input = static_cast<const uint8_t*>(storage->getData()) + static_cast<int>(attrib.offset); } else { - input = reinterpret_cast<const uint8_t*>(currentValue.FloatValues); + input = static_cast<const uint8_t*>(attrib.pointer); } - - if (instances == 0 || attrib.divisor == 0) - { - input += inputStride * start; - } - - gl::VertexFormat vertexFormat(attrib, currentValue.Type); - const d3d11::VertexFormat &vertexFormatInfo = d3d11::GetVertexFormatInfo(vertexFormat); - ASSERT(vertexFormatInfo.copyFunction != NULL); - vertexFormatInfo.copyFunction(input, inputStride, count, output); - - dxContext->Unmap(mBuffer, 0); - - return true; } else { - ERR("Vertex buffer not initialized."); - return false; + input = reinterpret_cast<const uint8_t*>(currentValue.FloatValues); } + + if (instances == 0 || attrib.divisor == 0) + { + input += inputStride * start; + } + + gl::VertexFormat vertexFormat(attrib, currentValue.Type); + const d3d11::VertexFormat &vertexFormatInfo = d3d11::GetVertexFormatInfo(vertexFormat); + ASSERT(vertexFormatInfo.copyFunction != NULL); + vertexFormatInfo.copyFunction(input, inputStride, count, output); + + dxContext->Unmap(mBuffer, 0); + + return gl::Error(GL_NO_ERROR); } -bool VertexBuffer11::getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei count, - GLsizei instances, unsigned int *outSpaceRequired) const +gl::Error VertexBuffer11::getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei count, + GLsizei instances, unsigned int *outSpaceRequired) const { unsigned int elementCount = 0; if (attrib.enabled) @@ -148,11 +145,11 @@ bool VertexBuffer11::getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei { *outSpaceRequired = elementSize * elementCount; } - return true; + return gl::Error(GL_NO_ERROR); } else { - return false; + return gl::Error(GL_OUT_OF_MEMORY, "New vertex buffer size would result in an overflow."); } } else @@ -162,7 +159,7 @@ bool VertexBuffer11::getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei { *outSpaceRequired = elementSize * 4; } - return true; + return gl::Error(GL_NO_ERROR); } } @@ -171,7 +168,7 @@ unsigned int VertexBuffer11::getBufferSize() const return mBufferSize; } -bool VertexBuffer11::setBufferSize(unsigned int size) +gl::Error VertexBuffer11::setBufferSize(unsigned int size) { if (size > mBufferSize) { @@ -179,33 +176,29 @@ bool VertexBuffer11::setBufferSize(unsigned int size) } else { - return true; + return gl::Error(GL_NO_ERROR); } } -bool VertexBuffer11::discard() +gl::Error VertexBuffer11::discard() { - if (mBuffer) + if (!mBuffer) { - ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext(); - - D3D11_MAPPED_SUBRESOURCE mappedResource; - HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(result)) - { - ERR("Vertex buffer map failed with error 0x%08x", result); - return false; - } + return gl::Error(GL_OUT_OF_MEMORY, "Internal vertex buffer is not initialized."); + } - dxContext->Unmap(mBuffer, 0); + ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext(); - return true; - } - else + D3D11_MAPPED_SUBRESOURCE mappedResource; + HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if (FAILED(result)) { - ERR("Vertex buffer not initialized."); - return false; + return gl::Error(GL_OUT_OF_MEMORY, "Failed to map internal buffer for discarding, HRESULT: 0x%08x", result); } + + dxContext->Unmap(mBuffer, 0); + + return gl::Error(GL_NO_ERROR); } ID3D11Buffer *VertexBuffer11::getBuffer() const diff --git a/src/libGLESv2/renderer/d3d/d3d11/VertexBuffer11.h b/src/libGLESv2/renderer/d3d/d3d11/VertexBuffer11.h index c2a5aa7a..0e10da1d 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/VertexBuffer11.h +++ b/src/libGLESv2/renderer/d3d/d3d11/VertexBuffer11.h @@ -21,19 +21,19 @@ class VertexBuffer11 : public VertexBuffer explicit VertexBuffer11(rx::Renderer11 *const renderer); virtual ~VertexBuffer11(); - virtual bool initialize(unsigned int size, bool dynamicUsage); + virtual gl::Error initialize(unsigned int size, bool dynamicUsage); static VertexBuffer11 *makeVertexBuffer11(VertexBuffer *vetexBuffer); - virtual bool storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, - GLint start, GLsizei count, GLsizei instances, unsigned int offset); + virtual gl::Error storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, + GLint start, GLsizei count, GLsizei instances, unsigned int offset); - virtual bool getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei count, GLsizei instances, - unsigned int *outSpaceRequired) const; + virtual gl::Error getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei count, GLsizei instances, + unsigned int *outSpaceRequired) const; virtual unsigned int getBufferSize() const; - virtual bool setBufferSize(unsigned int size); - virtual bool discard(); + virtual gl::Error setBufferSize(unsigned int size); + virtual gl::Error discard(); ID3D11Buffer *getBuffer() const; diff --git a/src/libGLESv2/renderer/d3d/d3d11/renderer11_utils.cpp b/src/libGLESv2/renderer/d3d/d3d11/renderer11_utils.cpp index 39bec903..b1867fba 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/renderer11_utils.cpp +++ b/src/libGLESv2/renderer/d3d/d3d11/renderer11_utils.cpp @@ -944,7 +944,7 @@ void GenerateCaps(ID3D11Device *device, gl::Caps *caps, gl::TextureCapsMap *text static_cast<GLint64>(caps->maxFragmentUniformComponents); caps->maxVaryingComponents = GetMaximumVertexOutputVectors(featureLevel) * 4; caps->maxVaryingVectors = GetMaximumVertexOutputVectors(featureLevel); - caps->maxCombinedTextureImageUnits = caps->maxVertexTextureImageUnits + caps->maxFragmentInputComponents; + caps->maxCombinedTextureImageUnits = caps->maxVertexTextureImageUnits + caps->maxTextureImageUnits; // Transform feedback limits caps->maxTransformFeedbackInterleavedComponents = GetMaximumStreamOutputInterleavedComponenets(featureLevel); diff --git a/src/libGLESv2/renderer/d3d/d3d9/Blit9.cpp b/src/libGLESv2/renderer/d3d/d3d9/Blit9.cpp index 59867fb1..80503d53 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/Blit9.cpp +++ b/src/libGLESv2/renderer/d3d/d3d9/Blit9.cpp @@ -208,7 +208,7 @@ bool Blit9::boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest) return true; } -bool Blit9::copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, TextureStorageInterface2D *storage, GLint level) +bool Blit9::copy2D(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level) { RenderTarget9 *renderTarget = NULL; IDirect3DSurface9 *source = NULL; @@ -230,7 +230,7 @@ bool Blit9::copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum de return gl::error(GL_OUT_OF_MEMORY, false); } - TextureStorage9_2D *storage9 = TextureStorage9_2D::makeTextureStorage9_2D(storage->getStorageInstance()); + TextureStorage9_2D *storage9 = TextureStorage9_2D::makeTextureStorage9_2D(storage); IDirect3DSurface9 *destSurface = storage9->getSurfaceLevel(level, true); bool result = false; @@ -244,7 +244,7 @@ bool Blit9::copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum de return result; } -bool Blit9::copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, TextureStorageInterfaceCube *storage, GLenum target, GLint level) +bool Blit9::copyCube(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, TextureStorage *storage, GLenum target, GLint level) { RenderTarget9 *renderTarget = NULL; IDirect3DSurface9 *source = NULL; @@ -266,7 +266,7 @@ bool Blit9::copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum de return gl::error(GL_OUT_OF_MEMORY, false); } - TextureStorage9_Cube *storage9 = TextureStorage9_Cube::makeTextureStorage9_Cube(storage->getStorageInstance()); + TextureStorage9_Cube *storage9 = TextureStorage9_Cube::makeTextureStorage9_Cube(storage); IDirect3DSurface9 *destSurface = storage9->getCubeMapSurface(target, level, true); bool result = false; diff --git a/src/libGLESv2/renderer/d3d/d3d9/Blit9.h b/src/libGLESv2/renderer/d3d/d3d9/Blit9.h index 40bf8910..46a3ee1c 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/Blit9.h +++ b/src/libGLESv2/renderer/d3d/d3d9/Blit9.h @@ -21,8 +21,7 @@ class Framebuffer; namespace rx { class Renderer9; -class TextureStorageInterface2D; -class TextureStorageInterfaceCube; +class TextureStorage; class Blit9 { @@ -32,8 +31,8 @@ class Blit9 // Copy from source surface to dest surface. // sourceRect, xoffset, yoffset are in D3D coordinates (0,0 in upper-left) - bool copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, TextureStorageInterface2D *storage, GLint level); - bool copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, TextureStorageInterfaceCube *storage, GLenum target, GLint level); + bool copy2D(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level); + bool copyCube(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, TextureStorage *storage, GLenum target, GLint level); // Copy from source surface to dest surface. // sourceRect, xoffset, yoffset are in D3D coordinates (0,0 in upper-left) diff --git a/src/libGLESv2/renderer/d3d/d3d9/Image9.cpp b/src/libGLESv2/renderer/d3d/d3d9/Image9.cpp index 95c920e8..18383fba 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/Image9.cpp +++ b/src/libGLESv2/renderer/d3d/d3d9/Image9.cpp @@ -270,15 +270,15 @@ IDirect3DSurface9 *Image9::getSurface() return mSurface; } -void Image9::setManagedSurface(TextureStorageInterface2D *storage, int level) +void Image9::setManagedSurface2D(TextureStorage *storage, int level) { - TextureStorage9_2D *storage9 = TextureStorage9_2D::makeTextureStorage9_2D(storage->getStorageInstance()); + TextureStorage9_2D *storage9 = TextureStorage9_2D::makeTextureStorage9_2D(storage); setManagedSurface(storage9->getSurfaceLevel(level, false)); } -void Image9::setManagedSurface(TextureStorageInterfaceCube *storage, int face, int level) +void Image9::setManagedSurfaceCube(TextureStorage *storage, int face, int level) { - TextureStorage9_Cube *storage9 = TextureStorage9_Cube::makeTextureStorage9_Cube(storage->getStorageInstance()); + TextureStorage9_Cube *storage9 = TextureStorage9_Cube::makeTextureStorage9_Cube(storage); setManagedSurface(storage9->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level, false)); } @@ -301,28 +301,28 @@ void Image9::setManagedSurface(IDirect3DSurface9 *surface) } } -bool Image9::copyToStorage(TextureStorageInterface2D *storage, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height) +bool Image9::copyToStorage2D(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height) { ASSERT(getSurface() != NULL); - TextureStorage9_2D *storage9 = TextureStorage9_2D::makeTextureStorage9_2D(storage->getStorageInstance()); + TextureStorage9_2D *storage9 = TextureStorage9_2D::makeTextureStorage9_2D(storage); return copyToSurface(storage9->getSurfaceLevel(level, true), xoffset, yoffset, width, height); } -bool Image9::copyToStorage(TextureStorageInterfaceCube *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height) +bool Image9::copyToStorageCube(TextureStorage *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height) { ASSERT(getSurface() != NULL); - TextureStorage9_Cube *storage9 = TextureStorage9_Cube::makeTextureStorage9_Cube(storage->getStorageInstance()); + TextureStorage9_Cube *storage9 = TextureStorage9_Cube::makeTextureStorage9_Cube(storage); return copyToSurface(storage9->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level, true), xoffset, yoffset, width, height); } -bool Image9::copyToStorage(TextureStorageInterface3D *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth) +bool Image9::copyToStorage3D(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth) { // 3D textures are not supported by the D3D9 backend. UNREACHABLE(); return false; } -bool Image9::copyToStorage(TextureStorageInterface2DArray *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height) +bool Image9::copyToStorage2DArray(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height) { // 2D array textures are not supported by the D3D9 backend. UNREACHABLE(); diff --git a/src/libGLESv2/renderer/d3d/d3d9/Image9.h b/src/libGLESv2/renderer/d3d/d3d9/Image9.h index 2d1536f2..08d8ee35 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/Image9.h +++ b/src/libGLESv2/renderer/d3d/d3d9/Image9.h @@ -22,8 +22,6 @@ namespace rx { class Renderer; class Renderer9; -class TextureStorageInterface2D; -class TextureStorageInterfaceCube; class Image9 : public ImageD3D { @@ -44,12 +42,12 @@ class Image9 : public ImageD3D virtual bool isDirty() const; IDirect3DSurface9 *getSurface(); - virtual void setManagedSurface(TextureStorageInterface2D *storage, int level); - virtual void setManagedSurface(TextureStorageInterfaceCube *storage, int face, int level); - virtual bool copyToStorage(TextureStorageInterface2D *storage, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); - virtual bool copyToStorage(TextureStorageInterfaceCube *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); - virtual bool copyToStorage(TextureStorageInterface3D *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); - virtual bool copyToStorage(TextureStorageInterface2DArray *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height); + virtual void setManagedSurface2D(TextureStorage *storage, int level); + virtual void setManagedSurfaceCube(TextureStorage *storage, int face, int level); + virtual bool copyToStorage2D(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); + virtual bool copyToStorageCube(TextureStorage *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); + virtual bool copyToStorage3D(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); + virtual bool copyToStorage2DArray(TextureStorage *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height); virtual void loadData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLint unpackAlignment, GLenum type, const void *input); diff --git a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp index cabec08d..dd750483 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp +++ b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp @@ -379,6 +379,17 @@ void Renderer9::initializeDevice() mDevice->SetRenderState(D3DRS_POINTSIZE_MAX, 0x3F800000); // 1.0f } + const gl::Caps &rendererCaps = getRendererCaps(); + + mForceSetVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits); + mCurVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits); + + mForceSetPixelSamplerStates.resize(rendererCaps.maxTextureImageUnits); + mCurPixelSamplerStates.resize(rendererCaps.maxTextureImageUnits); + + mCurVertexTextureSerials.resize(rendererCaps.maxVertexTextureImageUnits); + mCurPixelTextureSerials.resize(rendererCaps.maxTextureImageUnits); + markAllStateDirty(); mSceneStarted = false; @@ -633,8 +644,8 @@ void Renderer9::generateSwizzle(gl::Texture *texture) void Renderer9::setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &samplerState) { - bool *forceSetSamplers = (type == gl::SAMPLER_PIXEL) ? mForceSetPixelSamplerStates : mForceSetVertexSamplerStates; - gl::SamplerState *appliedSamplers = (type == gl::SAMPLER_PIXEL) ? mCurPixelSamplerStates: mCurVertexSamplerStates; + std::vector<bool> &forceSetSamplers = (type == gl::SAMPLER_PIXEL) ? mForceSetPixelSamplerStates : mForceSetVertexSamplerStates; + std::vector<gl::SamplerState> &appliedSamplers = (type == gl::SAMPLER_PIXEL) ? mCurPixelSamplerStates: mCurVertexSamplerStates; if (forceSetSamplers[index] || memcmp(&samplerState, &appliedSamplers[index], sizeof(gl::SamplerState)) != 0) { @@ -668,16 +679,16 @@ void Renderer9::setTexture(gl::SamplerType type, int index, gl::Texture *texture unsigned int serial = 0; bool forceSetTexture = false; - unsigned int *appliedSerials = (type == gl::SAMPLER_PIXEL) ? mCurPixelTextureSerials : mCurVertexTextureSerials; + std::vector<unsigned int> &appliedSerials = (type == gl::SAMPLER_PIXEL) ? mCurPixelTextureSerials : mCurVertexTextureSerials; if (texture) { TextureD3D* textureImpl = TextureD3D::makeTextureD3D(texture->getImplementation()); - TextureStorageInterface *texStorage = textureImpl->getNativeTexture(); + TextureStorage *texStorage = textureImpl->getNativeTexture(); if (texStorage) { - TextureStorage9 *storage9 = TextureStorage9::makeTextureStorage9(texStorage->getStorageInstance()); + TextureStorage9 *storage9 = TextureStorage9::makeTextureStorage9(texStorage); d3dTexture = storage9->getBaseTexture(); } // If we get NULL back from getBaseTexture here, something went wrong @@ -964,7 +975,7 @@ void Renderer9::setScissorRectangle(const gl::Rectangle &scissor, bool enabled) mForceSetScissor = false; } -bool Renderer9::setViewport(const gl::Rectangle &viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace, +void Renderer9::setViewport(const gl::Rectangle &viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace, bool ignoreViewport) { gl::Rectangle actualViewport = viewport; @@ -988,11 +999,6 @@ bool Renderer9::setViewport(const gl::Rectangle &viewport, float zNear, float zF dxViewport.MinZ = actualZNear; dxViewport.MaxZ = actualZFar; - if (dxViewport.Width <= 0 || dxViewport.Height <= 0) - { - return false; // Nothing to render - } - float depthFront = !gl::IsTriangleMode(drawMode) ? 0.0f : (frontFace == GL_CCW ? 1.0f : -1.0f); bool viewportChanged = mForceSetViewport || memcmp(&actualViewport, &mCurViewport, sizeof(gl::Rectangle)) != 0 || @@ -1045,7 +1051,6 @@ bool Renderer9::setViewport(const gl::Rectangle &viewport, float zNear, float zF } mForceSetViewport = false; - return true; } bool Renderer9::applyPrimitiveType(GLenum mode, GLsizei count) @@ -1255,14 +1260,14 @@ bool Renderer9::applyRenderTarget(gl::Framebuffer *framebuffer) return true; } -GLenum Renderer9::applyVertexBuffer(gl::ProgramBinary *programBinary, const gl::VertexAttribute vertexAttributes[], const gl::VertexAttribCurrentValueData currentValues[], - GLint first, GLsizei count, GLsizei instances) +gl::Error Renderer9::applyVertexBuffer(gl::ProgramBinary *programBinary, const gl::VertexAttribute vertexAttributes[], const gl::VertexAttribCurrentValueData currentValues[], + GLint first, GLsizei count, GLsizei instances) { TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS]; - GLenum err = mVertexDataManager->prepareVertexData(vertexAttributes, currentValues, programBinary, first, count, attributes, instances); - if (err != GL_NO_ERROR) + gl::Error error = mVertexDataManager->prepareVertexData(vertexAttributes, currentValues, programBinary, first, count, attributes, instances); + if (error.isError()) { - return err; + return error; } return mVertexDeclarationCache.applyDeclaration(mDevice, attributes, programBinary, instances, &mRepeatDraw); @@ -2028,12 +2033,15 @@ void Renderer9::markAllStateDirty() mForceSetViewport = true; mForceSetBlendState = true; - for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS; i++) + ASSERT(mForceSetVertexSamplerStates.size() == mCurVertexTextureSerials.size()); + for (unsigned int i = 0; i < mForceSetVertexSamplerStates.size(); i++) { mForceSetVertexSamplerStates[i] = true; mCurVertexTextureSerials[i] = 0; } - for (unsigned int i = 0; i < gl::MAX_TEXTURE_IMAGE_UNITS; i++) + + ASSERT(mForceSetPixelSamplerStates.size() == mCurPixelTextureSerials.size()); + for (unsigned int i = 0; i < mForceSetPixelSamplerStates.size(); i++) { mForceSetPixelSamplerStates[i] = true; mCurPixelTextureSerials[i] = 0; @@ -2327,14 +2335,14 @@ int Renderer9::getMaxSwapInterval() const return mMaxSwapInterval; } -bool Renderer9::copyToRenderTarget(TextureStorageInterface2D *dest, TextureStorageInterface2D *source) +bool Renderer9::copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source) { bool result = false; if (source && dest) { - TextureStorage9_2D *source9 = TextureStorage9_2D::makeTextureStorage9_2D(source->getStorageInstance()); - TextureStorage9_2D *dest9 = TextureStorage9_2D::makeTextureStorage9_2D(dest->getStorageInstance()); + TextureStorage9_2D *source9 = TextureStorage9_2D::makeTextureStorage9_2D(source); + TextureStorage9_2D *dest9 = TextureStorage9_2D::makeTextureStorage9_2D(dest); int levels = source9->getLevelCount(); for (int i = 0; i < levels; ++i) @@ -2357,14 +2365,14 @@ bool Renderer9::copyToRenderTarget(TextureStorageInterface2D *dest, TextureStora return result; } -bool Renderer9::copyToRenderTarget(TextureStorageInterfaceCube *dest, TextureStorageInterfaceCube *source) +bool Renderer9::copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source) { bool result = false; if (source && dest) { - TextureStorage9_Cube *source9 = TextureStorage9_Cube::makeTextureStorage9_Cube(source->getStorageInstance()); - TextureStorage9_Cube *dest9 = TextureStorage9_Cube::makeTextureStorage9_Cube(dest->getStorageInstance()); + TextureStorage9_Cube *source9 = TextureStorage9_Cube::makeTextureStorage9_Cube(source); + TextureStorage9_Cube *dest9 = TextureStorage9_Cube::makeTextureStorage9_Cube(dest); int levels = source9->getLevelCount(); for (int f = 0; f < 6; f++) { @@ -2389,14 +2397,14 @@ bool Renderer9::copyToRenderTarget(TextureStorageInterfaceCube *dest, TextureSto return result; } -bool Renderer9::copyToRenderTarget(TextureStorageInterface3D *dest, TextureStorageInterface3D *source) +bool Renderer9::copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source) { // 3D textures are not available in the D3D9 backend. UNREACHABLE(); return false; } -bool Renderer9::copyToRenderTarget(TextureStorageInterface2DArray *dest, TextureStorageInterface2DArray *source) +bool Renderer9::copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source) { // 2D array textures are not supported by the D3D9 backend. UNREACHABLE(); @@ -2420,8 +2428,8 @@ D3DPOOL Renderer9::getBufferPool(DWORD usage) const return D3DPOOL_DEFAULT; } -bool Renderer9::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, TextureStorageInterface2D *storage, GLint level) +bool Renderer9::copyImage2D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level) { RECT rect; rect.left = sourceRect.x; @@ -2429,11 +2437,11 @@ bool Renderer9::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sou rect.right = sourceRect.x + sourceRect.width; rect.bottom = sourceRect.y + sourceRect.height; - return mBlit->copy(framebuffer, rect, destFormat, xoffset, yoffset, storage, level); + return mBlit->copy2D(framebuffer, rect, destFormat, xoffset, yoffset, storage, level); } -bool Renderer9::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, TextureStorageInterfaceCube *storage, GLenum target, GLint level) +bool Renderer9::copyImageCube(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, TextureStorage *storage, GLenum target, GLint level) { RECT rect; rect.left = sourceRect.x; @@ -2441,19 +2449,19 @@ bool Renderer9::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sou rect.right = sourceRect.x + sourceRect.width; rect.bottom = sourceRect.y + sourceRect.height; - return mBlit->copy(framebuffer, rect, destFormat, xoffset, yoffset, storage, target, level); + return mBlit->copyCube(framebuffer, rect, destFormat, xoffset, yoffset, storage, target, level); } -bool Renderer9::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, GLint zOffset, TextureStorageInterface3D *storage, GLint level) +bool Renderer9::copyImage3D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, GLint zOffset, TextureStorage *storage, GLint level) { // 3D textures are not available in the D3D9 backend. UNREACHABLE(); return false; } -bool Renderer9::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, GLint zOffset, TextureStorageInterface2DArray *storage, GLint level) +bool Renderer9::copyImage2DArray(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, GLint zOffset, TextureStorage *storage, GLint level) { // 2D array textures are not available in the D3D9 backend. UNREACHABLE(); @@ -3088,12 +3096,9 @@ TextureImpl *Renderer9::createTexture(GLenum target) { switch(target) { - case GL_TEXTURE_2D: return new TextureD3D_2D(this); + case GL_TEXTURE_2D: return new TextureD3D_2D(this); case GL_TEXTURE_CUBE_MAP: return new TextureD3D_Cube(this); - case GL_TEXTURE_3D: return new TextureD3D_3D(this); - case GL_TEXTURE_2D_ARRAY: return new TextureD3D_2DArray(this); - default: - UNREACHABLE(); + default: UNREACHABLE(); } return NULL; diff --git a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h index 6dfad26f..87a33231 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h +++ b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h @@ -73,7 +73,7 @@ class Renderer9 : public Renderer int stencilBackRef, bool frontFaceCCW); virtual void setScissorRectangle(const gl::Rectangle &scissor, bool enabled); - virtual bool setViewport(const gl::Rectangle &viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace, + virtual void setViewport(const gl::Rectangle &viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace, bool ignoreViewport); virtual bool applyRenderTarget(gl::Framebuffer *frameBuffer); @@ -81,8 +81,8 @@ class Renderer9 : public Renderer bool rasterizerDiscard, bool transformFeedbackActive); virtual void applyUniforms(const gl::ProgramBinary &programBinary); virtual bool applyPrimitiveType(GLenum primitiveType, GLsizei elementCount); - virtual GLenum applyVertexBuffer(gl::ProgramBinary *programBinary, const gl::VertexAttribute vertexAttributes[], const gl::VertexAttribCurrentValueData currentValues[], - GLint first, GLsizei count, GLsizei instances); + virtual gl::Error applyVertexBuffer(gl::ProgramBinary *programBinary, const gl::VertexAttribute vertexAttributes[], const gl::VertexAttribCurrentValueData currentValues[], + GLint first, GLsizei count, GLsizei instances); virtual gl::Error applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo); virtual void applyTransformFeedbackBuffers(gl::Buffer *transformFeedbackBuffers[], GLintptr offsets[]); @@ -119,19 +119,19 @@ class Renderer9 : public Renderer virtual int getMaxSwapInterval() const; // Pixel operations - virtual bool copyToRenderTarget(TextureStorageInterface2D *dest, TextureStorageInterface2D *source); - virtual bool copyToRenderTarget(TextureStorageInterfaceCube *dest, TextureStorageInterfaceCube *source); - virtual bool copyToRenderTarget(TextureStorageInterface3D *dest, TextureStorageInterface3D *source); - virtual bool copyToRenderTarget(TextureStorageInterface2DArray *dest, TextureStorageInterface2DArray *source); - - virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, TextureStorageInterface2D *storage, GLint level); - virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, TextureStorageInterfaceCube *storage, GLenum target, GLint level); - virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, GLint zOffset, TextureStorageInterface3D *storage, GLint level); - virtual bool copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, - GLint xoffset, GLint yoffset, GLint zOffset, TextureStorageInterface2DArray *storage, GLint level); + virtual bool copyToRenderTarget2D(TextureStorage *dest, TextureStorage *source); + virtual bool copyToRenderTargetCube(TextureStorage *dest, TextureStorage *source); + virtual bool copyToRenderTarget3D(TextureStorage *dest, TextureStorage *source); + virtual bool copyToRenderTarget2DArray(TextureStorage *dest, TextureStorage *source); + + virtual bool copyImage2D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, TextureStorage *storage, GLint level); + virtual bool copyImageCube(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, TextureStorage *storage, GLenum target, GLint level); + virtual bool copyImage3D(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, GLint zOffset, TextureStorage *storage, GLint level); + virtual bool copyImage2DArray(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat, + GLint xoffset, GLint yoffset, GLint zOffset, TextureStorage *storage, GLint level); virtual bool blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget, const gl::Rectangle &drawRect, const gl::Rectangle *scissor, bool blitRenderTarget, bool blitDepth, bool blitStencil, GLenum filter); @@ -295,15 +295,15 @@ class Renderer9 : public Renderer GLuint mCurSampleMask; // Currently applied sampler states - bool mForceSetVertexSamplerStates[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; - gl::SamplerState mCurVertexSamplerStates[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; + std::vector<bool> mForceSetVertexSamplerStates; + std::vector<gl::SamplerState> mCurVertexSamplerStates; - bool mForceSetPixelSamplerStates[gl::MAX_TEXTURE_IMAGE_UNITS]; - gl::SamplerState mCurPixelSamplerStates[gl::MAX_TEXTURE_IMAGE_UNITS]; + std::vector<bool> mForceSetPixelSamplerStates; + std::vector<gl::SamplerState> mCurPixelSamplerStates; // Currently applied textures - unsigned int mCurVertexTextureSerials[gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS]; - unsigned int mCurPixelTextureSerials[gl::MAX_TEXTURE_IMAGE_UNITS]; + std::vector<unsigned int> mCurVertexTextureSerials; + std::vector<unsigned int> mCurPixelTextureSerials; unsigned int mAppliedIBSerial; IDirect3DVertexShader9 *mAppliedVertexShader; diff --git a/src/libGLESv2/renderer/d3d/d3d9/TextureStorage9.cpp b/src/libGLESv2/renderer/d3d/d3d9/TextureStorage9.cpp index 5b658235..f44e33db 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/TextureStorage9.cpp +++ b/src/libGLESv2/renderer/d3d/d3d9/TextureStorage9.cpp @@ -95,6 +95,7 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, SwapChain9 *swapchain mRenderTarget = NULL; initializeRenderTarget(); + initializeSerials(1, 1); } TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels) @@ -121,6 +122,7 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, GLenum internalformat } initializeRenderTarget(); + initializeSerials(getLevelCount(), 1); } TextureStorage9_2D::~TextureStorage9_2D() @@ -157,23 +159,28 @@ IDirect3DSurface9 *TextureStorage9_2D::getSurfaceLevel(int level, bool dirty) return surface; } -RenderTarget *TextureStorage9_2D::getRenderTarget(int level) +RenderTarget *TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &/*index*/) { return mRenderTarget; } -void TextureStorage9_2D::generateMipmap(int level) +void TextureStorage9_2D::generateMipmaps() { - IDirect3DSurface9 *upper = getSurfaceLevel(level - 1, false); - IDirect3DSurface9 *lower = getSurfaceLevel(level, true); + // Base level must already be defined - if (upper != NULL && lower != NULL) + for (int level = 1; level < getLevelCount(); level++) { - mRenderer->boxFilter(upper, lower); - } + IDirect3DSurface9 *upper = getSurfaceLevel(level - 1, false); + IDirect3DSurface9 *lower = getSurfaceLevel(level, true); - SafeRelease(upper); - SafeRelease(lower); + if (upper != NULL && lower != NULL) + { + mRenderer->boxFilter(upper, lower); + } + + SafeRelease(upper); + SafeRelease(lower); + } } IDirect3DBaseTexture9 *TextureStorage9_2D::getBaseTexture() const @@ -222,6 +229,7 @@ TextureStorage9_Cube::TextureStorage9_Cube(Renderer *renderer, GLenum internalfo } initializeRenderTarget(); + initializeSerials(getLevelCount() * 6, 6); } TextureStorage9_Cube::~TextureStorage9_Cube() @@ -263,23 +271,31 @@ IDirect3DSurface9 *TextureStorage9_Cube::getCubeMapSurface(GLenum faceTarget, in return surface; } -RenderTarget *TextureStorage9_Cube::getRenderTargetFace(GLenum faceTarget, int level) +RenderTarget *TextureStorage9_Cube::getRenderTarget(const gl::ImageIndex &index) { - return mRenderTarget[gl::TextureCubeMap::targetToLayerIndex(faceTarget)]; + return mRenderTarget[index.layerIndex]; } -void TextureStorage9_Cube::generateMipmap(int faceIndex, int level) +void TextureStorage9_Cube::generateMipmaps() { - IDirect3DSurface9 *upper = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level - 1, false); - IDirect3DSurface9 *lower = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level, true); + // Base level must already be defined - if (upper != NULL && lower != NULL) + for (int faceIndex = 0; faceIndex < 6; faceIndex++) { - mRenderer->boxFilter(upper, lower); - } + for (int level = 1; level < getLevelCount(); level++) + { + IDirect3DSurface9 *upper = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level - 1, false); + IDirect3DSurface9 *lower = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level, true); + + if (upper != NULL && lower != NULL) + { + mRenderer->boxFilter(upper, lower); + } - SafeRelease(upper); - SafeRelease(lower); + SafeRelease(upper); + SafeRelease(lower); + } + } } IDirect3DBaseTexture9 *TextureStorage9_Cube::getBaseTexture() const diff --git a/src/libGLESv2/renderer/d3d/d3d9/TextureStorage9.h b/src/libGLESv2/renderer/d3d/d3d9/TextureStorage9.h index cc7c155d..e698c7dd 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/TextureStorage9.h +++ b/src/libGLESv2/renderer/d3d/d3d9/TextureStorage9.h @@ -34,11 +34,8 @@ class TextureStorage9 : public TextureStorage DWORD getUsage() const; virtual IDirect3DBaseTexture9 *getBaseTexture() const = 0; - virtual RenderTarget *getRenderTarget(int level) { return NULL; } - virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level) { return NULL; } - virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer) { return NULL; } - virtual void generateMipmap(int level) {}; - virtual void generateMipmap(int face, int level) {}; + virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0; + virtual void generateMipmaps() = 0; virtual int getTopLevel() const; virtual bool isRenderTarget() const; @@ -68,9 +65,9 @@ class TextureStorage9_2D : public TextureStorage9 static TextureStorage9_2D *makeTextureStorage9_2D(TextureStorage *storage); IDirect3DSurface9 *getSurfaceLevel(int level, bool dirty); - virtual RenderTarget *getRenderTarget(int level); + virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); virtual IDirect3DBaseTexture9 *getBaseTexture() const; - virtual void generateMipmap(int level); + virtual void generateMipmaps(); private: DISALLOW_COPY_AND_ASSIGN(TextureStorage9_2D); @@ -90,9 +87,9 @@ class TextureStorage9_Cube : public TextureStorage9 static TextureStorage9_Cube *makeTextureStorage9_Cube(TextureStorage *storage); IDirect3DSurface9 *getCubeMapSurface(GLenum faceTarget, int level, bool dirty); - virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level); + virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); virtual IDirect3DBaseTexture9 *getBaseTexture() const; - virtual void generateMipmap(int faceIndex, int level); + virtual void generateMipmaps(); private: DISALLOW_COPY_AND_ASSIGN(TextureStorage9_Cube); diff --git a/src/libGLESv2/renderer/d3d/d3d9/VertexBuffer9.cpp b/src/libGLESv2/renderer/d3d/d3d9/VertexBuffer9.cpp index 7a20db3d..4cf77791 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/VertexBuffer9.cpp +++ b/src/libGLESv2/renderer/d3d/d3d9/VertexBuffer9.cpp @@ -29,7 +29,7 @@ VertexBuffer9::~VertexBuffer9() SafeRelease(mVertexBuffer); } -bool VertexBuffer9::initialize(unsigned int size, bool dynamicUsage) +gl::Error VertexBuffer9::initialize(unsigned int size, bool dynamicUsage) { SafeRelease(mVertexBuffer); @@ -47,14 +47,13 @@ bool VertexBuffer9::initialize(unsigned int size, bool dynamicUsage) if (FAILED(result)) { - ERR("Out of memory allocating a vertex buffer of size %lu.", size); - return false; + return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal vertex buffer of size, %lu.", size); } } mBufferSize = size; mDynamicUsage = dynamicUsage; - return true; + return gl::Error(GL_NO_ERROR); } VertexBuffer9 *VertexBuffer9::makeVertexBuffer9(VertexBuffer *vertexBuffer) @@ -63,84 +62,80 @@ VertexBuffer9 *VertexBuffer9::makeVertexBuffer9(VertexBuffer *vertexBuffer) return static_cast<VertexBuffer9*>(vertexBuffer); } -bool VertexBuffer9::storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, - GLint start, GLsizei count, GLsizei instances, unsigned int offset) +gl::Error VertexBuffer9::storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, + GLint start, GLsizei count, GLsizei instances, unsigned int offset) { - if (mVertexBuffer) + if (!mVertexBuffer) { - gl::Buffer *buffer = attrib.buffer.get(); + return gl::Error(GL_OUT_OF_MEMORY, "Internal vertex buffer is not initialized."); + } - int inputStride = gl::ComputeVertexAttributeStride(attrib); - int elementSize = gl::ComputeVertexAttributeTypeSize(attrib); + gl::Buffer *buffer = attrib.buffer.get(); - DWORD lockFlags = mDynamicUsage ? D3DLOCK_NOOVERWRITE : 0; + int inputStride = gl::ComputeVertexAttributeStride(attrib); + int elementSize = gl::ComputeVertexAttributeTypeSize(attrib); - uint8_t *mapPtr = NULL; + DWORD lockFlags = mDynamicUsage ? D3DLOCK_NOOVERWRITE : 0; - unsigned int mapSize; - if (!spaceRequired(attrib, count, instances, &mapSize)) - { - return false; - } + uint8_t *mapPtr = NULL; - HRESULT result = mVertexBuffer->Lock(offset, mapSize, reinterpret_cast<void**>(&mapPtr), lockFlags); + unsigned int mapSize; + gl::Error error = spaceRequired(attrib, count, instances, &mapSize); + if (error.isError()) + { + return error; + } - if (FAILED(result)) - { - ERR("Lock failed with error 0x%08x", result); - return false; - } + HRESULT result = mVertexBuffer->Lock(offset, mapSize, reinterpret_cast<void**>(&mapPtr), lockFlags); + if (FAILED(result)) + { + return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock internal vertex buffer, HRESULT: 0x%08x.", result); + } - const uint8_t *input = NULL; - if (attrib.enabled) + const uint8_t *input = NULL; + if (attrib.enabled) + { + if (buffer) { - if (buffer) - { - BufferImpl *storage = buffer->getImplementation(); - input = static_cast<const uint8_t*>(storage->getData()) + static_cast<int>(attrib.offset); - } - else - { - input = static_cast<const uint8_t*>(attrib.pointer); - } + BufferImpl *storage = buffer->getImplementation(); + input = static_cast<const uint8_t*>(storage->getData()) + static_cast<int>(attrib.offset); } else { - input = reinterpret_cast<const uint8_t*>(currentValue.FloatValues); - } - - if (instances == 0 || attrib.divisor == 0) - { - input += inputStride * start; + input = static_cast<const uint8_t*>(attrib.pointer); } + } + else + { + input = reinterpret_cast<const uint8_t*>(currentValue.FloatValues); + } - gl::VertexFormat vertexFormat(attrib, currentValue.Type); - const d3d9::VertexFormat &d3dVertexInfo = d3d9::GetVertexFormatInfo(mRenderer->getCapsDeclTypes(), vertexFormat); - bool needsConversion = (d3dVertexInfo.conversionType & VERTEX_CONVERT_CPU) > 0; - - if (!needsConversion && inputStride == elementSize) - { - size_t copySize = static_cast<size_t>(count) * static_cast<size_t>(inputStride); - memcpy(mapPtr, input, copySize); - } - else - { - d3dVertexInfo.copyFunction(input, inputStride, count, mapPtr); - } + if (instances == 0 || attrib.divisor == 0) + { + input += inputStride * start; + } - mVertexBuffer->Unlock(); + gl::VertexFormat vertexFormat(attrib, currentValue.Type); + const d3d9::VertexFormat &d3dVertexInfo = d3d9::GetVertexFormatInfo(mRenderer->getCapsDeclTypes(), vertexFormat); + bool needsConversion = (d3dVertexInfo.conversionType & VERTEX_CONVERT_CPU) > 0; - return true; + if (!needsConversion && inputStride == elementSize) + { + size_t copySize = static_cast<size_t>(count) * static_cast<size_t>(inputStride); + memcpy(mapPtr, input, copySize); } else { - ERR("Vertex buffer not initialized."); - return false; + d3dVertexInfo.copyFunction(input, inputStride, count, mapPtr); } + + mVertexBuffer->Unlock(); + + return gl::Error(GL_NO_ERROR); } -bool VertexBuffer9::getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei count, GLsizei instances, - unsigned int *outSpaceRequired) const +gl::Error VertexBuffer9::getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei count, GLsizei instances, + unsigned int *outSpaceRequired) const { return spaceRequired(attrib, count, instances, outSpaceRequired); } @@ -150,7 +145,7 @@ unsigned int VertexBuffer9::getBufferSize() const return mBufferSize; } -bool VertexBuffer9::setBufferSize(unsigned int size) +gl::Error VertexBuffer9::setBufferSize(unsigned int size) { if (size > mBufferSize) { @@ -158,38 +153,33 @@ bool VertexBuffer9::setBufferSize(unsigned int size) } else { - return true; + return gl::Error(GL_NO_ERROR); } } -bool VertexBuffer9::discard() +gl::Error VertexBuffer9::discard() { - if (mVertexBuffer) + if (!mVertexBuffer) { - void *dummy; - HRESULT result; - - result = mVertexBuffer->Lock(0, 1, &dummy, D3DLOCK_DISCARD); - if (FAILED(result)) - { - ERR("Discard lock failed with error 0x%08x", result); - return false; - } + return gl::Error(GL_OUT_OF_MEMORY, "Internal vertex buffer is not initialized."); + } - result = mVertexBuffer->Unlock(); - if (FAILED(result)) - { - ERR("Discard unlock failed with error 0x%08x", result); - return false; - } + void *dummy; + HRESULT result; - return true; + result = mVertexBuffer->Lock(0, 1, &dummy, D3DLOCK_DISCARD); + if (FAILED(result)) + { + return gl::Error(GL_OUT_OF_MEMORY, "Failed to lock internal buffer for discarding, HRESULT: 0x%08x", result); } - else + + result = mVertexBuffer->Unlock(); + if (FAILED(result)) { - ERR("Vertex buffer not initialized."); - return false; + return gl::Error(GL_OUT_OF_MEMORY, "Failed to unlock internal buffer for discarding, HRESULT: 0x%08x", result); } + + return gl::Error(GL_NO_ERROR); } IDirect3DVertexBuffer9 * VertexBuffer9::getBuffer() const @@ -197,8 +187,8 @@ IDirect3DVertexBuffer9 * VertexBuffer9::getBuffer() const return mVertexBuffer; } -bool VertexBuffer9::spaceRequired(const gl::VertexAttribute &attrib, std::size_t count, GLsizei instances, - unsigned int *outSpaceRequired) const +gl::Error VertexBuffer9::spaceRequired(const gl::VertexAttribute &attrib, std::size_t count, GLsizei instances, + unsigned int *outSpaceRequired) const { gl::VertexFormat vertexFormat(attrib, GL_FLOAT); const d3d9::VertexFormat &d3d9VertexInfo = d3d9::GetVertexFormatInfo(mRenderer->getCapsDeclTypes(), vertexFormat); @@ -222,11 +212,11 @@ bool VertexBuffer9::spaceRequired(const gl::VertexAttribute &attrib, std::size_t { *outSpaceRequired = d3d9VertexInfo.outputElementSize * elementCount; } - return true; + return gl::Error(GL_NO_ERROR); } else { - return false; + return gl::Error(GL_OUT_OF_MEMORY, "New vertex buffer size would result in an overflow."); } } else @@ -236,7 +226,7 @@ bool VertexBuffer9::spaceRequired(const gl::VertexAttribute &attrib, std::size_t { *outSpaceRequired = elementSize * 4; } - return true; + return gl::Error(GL_NO_ERROR); } } diff --git a/src/libGLESv2/renderer/d3d/d3d9/VertexBuffer9.h b/src/libGLESv2/renderer/d3d/d3d9/VertexBuffer9.h index 6bde0cde..bdcf4bb6 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/VertexBuffer9.h +++ b/src/libGLESv2/renderer/d3d/d3d9/VertexBuffer9.h @@ -21,18 +21,18 @@ class VertexBuffer9 : public VertexBuffer explicit VertexBuffer9(rx::Renderer9 *renderer); virtual ~VertexBuffer9(); - virtual bool initialize(unsigned int size, bool dynamicUsage); + virtual gl::Error initialize(unsigned int size, bool dynamicUsage); static VertexBuffer9 *makeVertexBuffer9(VertexBuffer *vertexBuffer); - virtual bool storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, - GLint start, GLsizei count, GLsizei instances, unsigned int offset); + virtual gl::Error storeVertexAttributes(const gl::VertexAttribute &attrib, const gl::VertexAttribCurrentValueData ¤tValue, + GLint start, GLsizei count, GLsizei instances, unsigned int offset); - virtual bool getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei count, GLsizei instances, unsigned int *outSpaceRequired) const; + virtual gl::Error getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei count, GLsizei instances, unsigned int *outSpaceRequired) const; virtual unsigned int getBufferSize() const; - virtual bool setBufferSize(unsigned int size); - virtual bool discard(); + virtual gl::Error setBufferSize(unsigned int size); + virtual gl::Error discard(); IDirect3DVertexBuffer9 *getBuffer() const; @@ -45,8 +45,8 @@ class VertexBuffer9 : public VertexBuffer unsigned int mBufferSize; bool mDynamicUsage; - bool spaceRequired(const gl::VertexAttribute &attrib, std::size_t count, GLsizei instances, - unsigned int *outSpaceRequired) const; + gl::Error spaceRequired(const gl::VertexAttribute &attrib, std::size_t count, GLsizei instances, + unsigned int *outSpaceRequired) const; }; } diff --git a/src/libGLESv2/renderer/d3d/d3d9/VertexDeclarationCache.cpp b/src/libGLESv2/renderer/d3d/d3d9/VertexDeclarationCache.cpp index d0d72c01..cefd786f 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/VertexDeclarationCache.cpp +++ b/src/libGLESv2/renderer/d3d/d3d9/VertexDeclarationCache.cpp @@ -40,7 +40,7 @@ VertexDeclarationCache::~VertexDeclarationCache() } } -GLenum VertexDeclarationCache::applyDeclaration(IDirect3DDevice9 *device, TranslatedAttribute attributes[], gl::ProgramBinary *programBinary, GLsizei instances, GLsizei *repeatDraw) +gl::Error VertexDeclarationCache::applyDeclaration(IDirect3DDevice9 *device, TranslatedAttribute attributes[], gl::ProgramBinary *programBinary, GLsizei instances, GLsizei *repeatDraw) { *repeatDraw = 1; @@ -188,7 +188,7 @@ GLenum VertexDeclarationCache::applyDeclaration(IDirect3DDevice9 *device, Transl mLastSetVDecl = entry->vertexDeclaration; } - return GL_NO_ERROR; + return gl::Error(GL_NO_ERROR); } } @@ -210,12 +210,17 @@ GLenum VertexDeclarationCache::applyDeclaration(IDirect3DDevice9 *device, Transl } memcpy(lastCache->cachedElements, elements, (element - elements) * sizeof(D3DVERTEXELEMENT9)); - device->CreateVertexDeclaration(elements, &lastCache->vertexDeclaration); + HRESULT result = device->CreateVertexDeclaration(elements, &lastCache->vertexDeclaration); + if (FAILED(result)) + { + return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal vertex declaration, result: 0x%X.", result); + } + device->SetVertexDeclaration(lastCache->vertexDeclaration); mLastSetVDecl = lastCache->vertexDeclaration; lastCache->lruCount = ++mMaxLru; - return GL_NO_ERROR; + return gl::Error(GL_NO_ERROR); } void VertexDeclarationCache::markStateDirty() diff --git a/src/libGLESv2/renderer/d3d/d3d9/VertexDeclarationCache.h b/src/libGLESv2/renderer/d3d/d3d9/VertexDeclarationCache.h index 004e28df..9af36e0d 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/VertexDeclarationCache.h +++ b/src/libGLESv2/renderer/d3d/d3d9/VertexDeclarationCache.h @@ -9,6 +9,7 @@ #ifndef LIBGLESV2_RENDERER_VERTEXDECLARATIONCACHE_H_ #define LIBGLESV2_RENDERER_VERTEXDECLARATIONCACHE_H_ +#include "libGLESv2/Error.h" #include "libGLESv2/renderer/d3d/VertexDataManager.h" namespace gl @@ -25,7 +26,7 @@ class VertexDeclarationCache VertexDeclarationCache(); ~VertexDeclarationCache(); - GLenum applyDeclaration(IDirect3DDevice9 *device, TranslatedAttribute attributes[], gl::ProgramBinary *programBinary, GLsizei instances, GLsizei *repeatDraw); + gl::Error applyDeclaration(IDirect3DDevice9 *device, TranslatedAttribute attributes[], gl::ProgramBinary *programBinary, GLsizei instances, GLsizei *repeatDraw); void markStateDirty(); diff --git a/src/libGLESv2/renderer/d3d/d3d9/formatutils9.cpp b/src/libGLESv2/renderer/d3d/d3d9/formatutils9.cpp index b0d3868f..f3acaf79 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/formatutils9.cpp +++ b/src/libGLESv2/renderer/d3d/d3d9/formatutils9.cpp @@ -222,8 +222,17 @@ static D3D9FormatMap BuildD3D9FormatMap() // | Internal format | Texture format | Render format | Load function | InsertD3D9FormatInfo(&map, GL_NONE, D3DFMT_NULL, D3DFMT_NULL, UnreachableLoad ); + // We choose to downsample the GL_DEPTH_COMPONENT32_OES format to a 24-bit format because D3DFMT_D32 is not widely + // supported. We're allowed to do this because: + // - The ES spec 2.0.25 sec 3.7.1 states that we're allowed to store texture formats with internal format + // resolutions of our own choosing. + // - OES_depth_texture states that downsampling of the depth formats is allowed. + // - ANGLE_depth_texture does not state minimum required resolutions of the depth texture formats it + // introduces. + // In ES3 however, there are minimum resolutions for the texture formats and this would not be allowed. + InsertD3D9FormatInfo(&map, GL_DEPTH_COMPONENT16, D3DFMT_INTZ, D3DFMT_D24S8, UnreachableLoad ); - InsertD3D9FormatInfo(&map, GL_DEPTH_COMPONENT32_OES, D3DFMT_INTZ, D3DFMT_D32, UnreachableLoad ); + InsertD3D9FormatInfo(&map, GL_DEPTH_COMPONENT32_OES, D3DFMT_INTZ, D3DFMT_D24X8, UnreachableLoad ); InsertD3D9FormatInfo(&map, GL_DEPTH24_STENCIL8_OES, D3DFMT_INTZ, D3DFMT_D24S8, UnreachableLoad ); InsertD3D9FormatInfo(&map, GL_STENCIL_INDEX8, D3DFMT_UNKNOWN, D3DFMT_D24S8, UnreachableLoad ); // TODO: What's the texture format? diff --git a/src/libGLESv2/renderer/d3d/d3d9/renderer9_utils.cpp b/src/libGLESv2/renderer/d3d/d3d9/renderer9_utils.cpp index 879a6427..d6f950a5 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/renderer9_utils.cpp +++ b/src/libGLESv2/renderer/d3d/d3d9/renderer9_utils.cpp @@ -436,7 +436,7 @@ void GenerateCaps(IDirect3D9 *d3d9, IDirect3DDevice9 *device, D3DDEVTYPE deviceT // Aggregate shader limits caps->maxVaryingVectors = caps->maxVertexOutputComponents / 4; - caps->maxCombinedTextureImageUnits = caps->maxVertexTextureImageUnits + caps->maxFragmentInputComponents; + caps->maxCombinedTextureImageUnits = caps->maxVertexTextureImageUnits + caps->maxTextureImageUnits; // Transform feedback limits caps->maxTransformFeedbackInterleavedComponents = 0; diff --git a/tests/angle_tests/BufferDataTest.cpp b/tests/angle_tests/BufferDataTest.cpp index 41c00950..c566a85b 100644 --- a/tests/angle_tests/BufferDataTest.cpp +++ b/tests/angle_tests/BufferDataTest.cpp @@ -114,6 +114,19 @@ TEST_F(BufferDataTest, ZeroNonNULLData) delete [] zeroData; } +TEST_F(BufferDataTest, NULLResolvedData) +{ + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_DYNAMIC_DRAW); + + glUseProgram(mProgram); + glVertexAttribPointer(mAttribLocation, 1, GL_FLOAT, GL_FALSE, 4, NULL); + glEnableVertexAttribArray(mAttribLocation); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + drawQuad(mProgram, "position", 0.5f); +} + TEST_F(BufferDataTest, HugeSetDataShouldNotCrash) { glBindBuffer(GL_ARRAY_BUFFER, mBuffer); diff --git a/tests/angle_tests/ClearTest.cpp b/tests/angle_tests/ClearTest.cpp index 25429993..a8c0476b 100644 --- a/tests/angle_tests/ClearTest.cpp +++ b/tests/angle_tests/ClearTest.cpp @@ -137,4 +137,54 @@ TEST_F(ClearTest, MaskedClearBufferBug) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, 0, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0); EXPECT_PIXEL_EQ(0, 0, 0, 127, 255, 255); + + glDeleteTextures(2, textures); +} + +TEST_F(ClearTest, BadFBOSerialBug) +{ + // First make a simple framebuffer, and clear it to green + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + + GLuint textures[2]; + glGenTextures(2, &textures[0]); + + glBindTexture(GL_TEXTURE_2D, textures[0]); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight()); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0); + + GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0 }; + glDrawBuffers(1, drawBuffers); + + float clearValues1[] = { 0.0f, 1.0f, 0.0f, 1.0f }; + glClearBufferfv(GL_COLOR, 0, clearValues1); + + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); + + // Next make a second framebuffer, and draw it to red + // (Triggers bad applied render target serial) + GLuint fbo2; + glGenFramebuffers(1, &fbo2); + ASSERT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, fbo2); + + glBindTexture(GL_TEXTURE_2D, textures[1]); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight()); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0); + + glDrawBuffers(1, drawBuffers); + + drawQuad(mProgram, "position", 0.5f); + + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + // Check that the first framebuffer is still green. + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); + + glDeleteTextures(2, textures); + glDeleteFramebuffers(1, &fbo2); } diff --git a/tests/angle_tests/DepthStencilFormatsTest.cpp b/tests/angle_tests/DepthStencilFormatsTest.cpp new file mode 100644 index 00000000..56d5210a --- /dev/null +++ b/tests/angle_tests/DepthStencilFormatsTest.cpp @@ -0,0 +1,96 @@ +#include "ANGLETest.h" + +class DepthStencilFormatsTest : public ANGLETest +{ +protected: + DepthStencilFormatsTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setClientVersion(2); + } + + bool checkTexImageFormatSupport(GLenum format, GLenum type) + { + EXPECT_GL_NO_ERROR(); + + GLuint tex = 0; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexImage2D(GL_TEXTURE_2D, 0, format, 1, 1, 0, format, type, NULL); + glDeleteTextures(1, &tex); + + return (glGetError() == GL_NO_ERROR); + } + + bool checkTexStorageFormatSupport(GLenum internalFormat) + { + EXPECT_GL_NO_ERROR(); + + GLuint tex = 0; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, internalFormat, 1, 1); + glDeleteTextures(1, &tex); + + return (glGetError() == GL_NO_ERROR); + } + + bool checkRenderbufferFormatSupport(GLenum internalFormat) + { + EXPECT_GL_NO_ERROR(); + + GLuint rb = 0; + glGenRenderbuffers(1, &rb); + glBindRenderbuffer(GL_RENDERBUFFER, rb); + glRenderbufferStorage(GL_RENDERBUFFER, internalFormat, 1, 1); + glDeleteRenderbuffers(1, &rb); + + return (glGetError() == GL_NO_ERROR); + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + } + + virtual void TearDown() + { + ANGLETest::TearDown(); + } +}; + +TEST_F(DepthStencilFormatsTest, DepthTexture) +{ + bool shouldHaveTextureSupport = extensionEnabled("GL_ANGLE_depth_texture"); + EXPECT_EQ(shouldHaveTextureSupport, checkTexImageFormatSupport(GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT)); + EXPECT_EQ(shouldHaveTextureSupport, checkTexImageFormatSupport(GL_DEPTH_COMPONENT, GL_UNSIGNED_INT)); + + if (extensionEnabled("GL_EXT_texture_storage")) + { + EXPECT_EQ(shouldHaveTextureSupport, checkTexStorageFormatSupport(GL_DEPTH_COMPONENT16)); + EXPECT_EQ(shouldHaveTextureSupport, checkTexStorageFormatSupport(GL_DEPTH_COMPONENT32_OES)); + } +} + +TEST_F(DepthStencilFormatsTest, PackedDepthStencil) +{ + // Expected to fail in D3D9 if GL_OES_packed_depth_stencil is not present. + // Expected to fail in D3D11 if GL_OES_packed_depth_stencil or GL_ANGLE_depth_texture is not present. + + bool shouldHaveRenderbufferSupport = extensionEnabled("GL_OES_packed_depth_stencil"); + EXPECT_EQ(shouldHaveRenderbufferSupport, checkRenderbufferFormatSupport(GL_DEPTH24_STENCIL8_OES)); + + bool shouldHaveTextureSupport = extensionEnabled("GL_OES_packed_depth_stencil") && + extensionEnabled("GL_ANGLE_depth_texture"); + EXPECT_EQ(shouldHaveTextureSupport, checkTexImageFormatSupport(GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES)); + + if (extensionEnabled("GL_EXT_texture_storage")) + { + EXPECT_EQ(shouldHaveTextureSupport, checkTexStorageFormatSupport(GL_DEPTH24_STENCIL8_OES)); + } +} diff --git a/tests/angle_tests/TransformFeedbackTest.cpp b/tests/angle_tests/TransformFeedbackTest.cpp new file mode 100644 index 00000000..8bdb4e71 --- /dev/null +++ b/tests/angle_tests/TransformFeedbackTest.cpp @@ -0,0 +1,112 @@ +#include "ANGLETest.h" + +class TransformFeedbackTest : public ANGLETest +{ + protected: + TransformFeedbackTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setClientVersion(3); + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + + void main() + { + gl_Position = position; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision highp float; + + void main() + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + if (mProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + glGenBuffers(1, &mTransformFeedbackBuffer); + mTransformFeedbackBufferSize = 1 << 24; // ~16MB + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBuffer); + glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBufferSize, NULL, GL_STATIC_DRAW); + + ASSERT_GL_NO_ERROR(); + } + + virtual void TearDown() + { + glDeleteProgram(mProgram); + glDeleteBuffers(1, &mTransformFeedbackBuffer); + ANGLETest::TearDown(); + } + + GLuint mProgram; + + size_t mTransformFeedbackBufferSize; + GLuint mTransformFeedbackBuffer; +}; + +TEST_F(TransformFeedbackTest, ZeroSizedViewport) +{ + // Set the program's transform feedback varyings (just gl_Position) + const GLchar* transformFeedbackVaryings[] = + { + "gl_Position" + }; + glTransformFeedbackVaryings(mProgram, ArraySize(transformFeedbackVaryings), transformFeedbackVaryings, GL_INTERLEAVED_ATTRIBS); + glLinkProgram(mProgram); + + // Re-link the program + GLint linkStatus; + glGetProgramiv(mProgram, GL_LINK_STATUS, &linkStatus); + ASSERT_NE(linkStatus, 0); + + glUseProgram(mProgram); + + // Bind the buffer for transform feedback output and start transform feedback + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer); + glBeginTransformFeedback(GL_TRIANGLES); + + // Create a query to check how many primitives were written + GLuint primitivesWrittenQuery = 0; + glGenQueries(1, &primitivesWrittenQuery); + glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQuery); + + // Set a viewport that would result in no pixels being written to the framebuffer and draw + // a quad + glViewport(0, 0, 0, 0); + + drawQuad(mProgram, "position", 0.5f); + + // End the query and transform feedkback + glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); + glEndTransformFeedback(); + + // Check how many primitives were written and verify that some were written even if + // no pixels were rendered + GLuint primitivesWritten = 0; + glGetQueryObjectuiv(primitivesWrittenQuery, GL_QUERY_RESULT_EXT, &primitivesWritten); + EXPECT_GL_NO_ERROR(); + + EXPECT_EQ(primitivesWritten, 2); +} |