Implemented mipmap generation for 2D array textures.

TRAC #22927 Signed-off-by: Jamie Madill Signed-off-by: Nicolas Capens Author: Geoff Lang git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2276 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 44b2768f
...@@ -2128,7 +2128,35 @@ void Texture2DArray::storage(GLsizei levels, GLenum internalformat, GLsizei widt ...@@ -2128,7 +2128,35 @@ void Texture2DArray::storage(GLsizei levels, GLenum internalformat, GLsizei widt
void Texture2DArray::generateMipmaps() void Texture2DArray::generateMipmaps()
{ {
UNIMPLEMENTED(); // Purge array levels 1 through q and reset them to represent the generated mipmap levels.
int q = log2(std::max(getWidth(0), getHeight(0)));
for (int i = 1; i <= q; i++)
{
redefineImage(i, getInternalFormat(0), std::max(getWidth(0) >> i, 1), std::max(getHeight(0) >> i, 1), getDepth(0));
}
if (mTexStorage && mTexStorage->isRenderTarget())
{
for (int level = 1; level <= q; level++)
{
mTexStorage->generateMipmap(level);
for (int layer = 0; layer < mLayerCounts[level]; layer++)
{
mImageArray[level][layer]->markClean();
}
}
}
else
{
for (int level = 1; level <= q; level++)
{
for (int layer = 0; layer < mLayerCounts[level]; layer++)
{
mRenderer->generateMipmap(mImageArray[level][layer], mImageArray[level - 1][layer]);
}
}
}
} }
void Texture2DArray::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) void Texture2DArray::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source)
......
...@@ -3201,6 +3201,23 @@ void __stdcall glGenerateMipmap(GLenum target) ...@@ -3201,6 +3201,23 @@ void __stdcall glGenerateMipmap(GLenum target)
break; break;
} }
case GL_TEXTURE_2D_ARRAY:
{
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
gl::Texture2DArray *tex2darr = context->getTexture2DArray();
if (tex2darr->isCompressed(0))
{
return gl::error(GL_INVALID_OPERATION);
}
tex2darr->generateMipmaps();
break;
}
default: default:
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
} }
......
...@@ -987,8 +987,22 @@ RenderTarget *TextureStorage11_2DArray::getRenderTargetLayer(int mipLevel, int l ...@@ -987,8 +987,22 @@ RenderTarget *TextureStorage11_2DArray::getRenderTargetLayer(int mipLevel, int l
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
HRESULT result; HRESULT result;
// TODO, what kind of SRV is expected here? D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
ID3D11ShaderResourceView *srv = NULL; srvDesc.Format = mShaderResourceFormat;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
srvDesc.Texture2DArray.MostDetailedMip = mipLevel;
srvDesc.Texture2DArray.MipLevels = 1;
srvDesc.Texture2DArray.FirstArraySlice = layer;
srvDesc.Texture2DArray.ArraySize = 1;
ID3D11ShaderResourceView *srv;
result = device->CreateShaderResourceView(mTexture, &srvDesc, &srv);
if (result == E_OUTOFMEMORY)
{
return gl::error(GL_OUT_OF_MEMORY, static_cast<RenderTarget*>(NULL));
}
ASSERT(SUCCEEDED(result));
if (mRenderTargetFormat != DXGI_FORMAT_UNKNOWN) if (mRenderTargetFormat != DXGI_FORMAT_UNKNOWN)
{ {
...@@ -1033,7 +1047,13 @@ RenderTarget *TextureStorage11_2DArray::getRenderTargetLayer(int mipLevel, int l ...@@ -1033,7 +1047,13 @@ RenderTarget *TextureStorage11_2DArray::getRenderTargetLayer(int mipLevel, int l
void TextureStorage11_2DArray::generateMipmap(int level) void TextureStorage11_2DArray::generateMipmap(int level)
{ {
UNIMPLEMENTED(); for (unsigned int layer = 0; layer < mTextureDepth; layer++)
{
RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTargetLayer(level - 1, layer));
RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTargetLayer(level, layer));
generateMipmapLayer(source, dest);
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment