Replaced the Image::generateMipmap switch statements with function calls to get…

Replaced the Image::generateMipmap switch statements with function calls to get the mip generation function. TRAC #22972 Signed-off-by: Jamie Madill Signed-off-by: Nicolas Capens Author: Geoff Lang git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2319 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent f73d40f8
......@@ -18,7 +18,6 @@
#include "libGLESv2/utilities.h"
#include "libGLESv2/renderer/formatutils11.h"
#include "libGLESv2/renderer/renderer11_utils.h"
#include "libGLESv2/renderer/generatemip.h"
namespace rx
{
......@@ -50,60 +49,36 @@ void Image11::generateMipmap(Image11 *dest, Image11 *src)
ASSERT(src->getWidth() == 1 || src->getWidth() / 2 == dest->getWidth());
ASSERT(src->getHeight() == 1 || src->getHeight() / 2 == dest->getHeight());
D3D11_MAPPED_SUBRESOURCE destMapped, srcMapped;
dest->map(D3D11_MAP_WRITE, &destMapped);
src->map(D3D11_MAP_READ, &srcMapped);
MipGenerationFunction mipFunction = d3d11::GetMipGenerationFunction(src->getDXGIFormat());
ASSERT(mipFunction != NULL);
const unsigned char *sourceData = reinterpret_cast<const unsigned char*>(srcMapped.pData);
unsigned char *destData = reinterpret_cast<unsigned char*>(destMapped.pData);
D3D11_MAPPED_SUBRESOURCE destMapped;
HRESULT destMapResult = dest->map(D3D11_MAP_WRITE, &destMapped);
if (FAILED(destMapResult))
{
ERR("Failed to map destination image for mip map generation. HRESULT:0x%X", destMapResult);
return;
}
if (sourceData && destData)
D3D11_MAPPED_SUBRESOURCE srcMapped;
HRESULT srcMapResult = src->map(D3D11_MAP_READ, &srcMapped);
if (FAILED(srcMapResult))
{
switch (src->getDXGIFormat())
{
case DXGI_FORMAT_R8G8B8A8_UNORM:
case DXGI_FORMAT_B8G8R8A8_UNORM:
GenerateMip<R8G8B8A8>(src->getWidth(), src->getHeight(), src->getDepth(), sourceData, srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch, destMapped.DepthPitch);
break;
case DXGI_FORMAT_A8_UNORM:
GenerateMip<A8>(src->getWidth(), src->getHeight(), src->getDepth(), sourceData, srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch, destMapped.DepthPitch);
break;
case DXGI_FORMAT_R8_UNORM:
GenerateMip<R8>(src->getWidth(), src->getHeight(), src->getDepth(), sourceData, srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch, destMapped.DepthPitch);
break;
case DXGI_FORMAT_R32G32B32A32_FLOAT:
GenerateMip<A32B32G32R32F>(src->getWidth(), src->getHeight(), src->getDepth(), sourceData, srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch, destMapped.DepthPitch);
break;
case DXGI_FORMAT_R32G32B32_FLOAT:
GenerateMip<R32G32B32F>(src->getWidth(), src->getHeight(), src->getDepth(), sourceData, srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch, destMapped.DepthPitch);
break;
case DXGI_FORMAT_R16G16B16A16_FLOAT:
GenerateMip<A16B16G16R16F>(src->getWidth(), src->getHeight(), src->getDepth(), sourceData, srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch, destMapped.DepthPitch);
break;
case DXGI_FORMAT_R8G8_UNORM:
GenerateMip<R8G8>(src->getWidth(), src->getHeight(), src->getDepth(), sourceData, srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch, destMapped.DepthPitch);
break;
case DXGI_FORMAT_R16_FLOAT:
GenerateMip<R16F>(src->getWidth(), src->getHeight(), src->getDepth(), sourceData, srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch, destMapped.DepthPitch);
break;
case DXGI_FORMAT_R16G16_FLOAT:
GenerateMip<R16G16F>(src->getWidth(), src->getHeight(), src->getDepth(), sourceData, srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch, destMapped.DepthPitch);
break;
case DXGI_FORMAT_R32_FLOAT:
GenerateMip<R32F>(src->getWidth(), src->getHeight(), src->getDepth(), sourceData, srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch, destMapped.DepthPitch);
break;
case DXGI_FORMAT_R32G32_FLOAT:
GenerateMip<R32G32F>(src->getWidth(), src->getHeight(), src->getDepth(), sourceData, srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch, destMapped.DepthPitch);
break;
default:
UNREACHABLE();
break;
}
ERR("Failed to map source image for mip map generation. HRESULT:0x%X", srcMapResult);
dest->unmap();
src->unmap();
return;
}
const unsigned char *sourceData = reinterpret_cast<const unsigned char*>(srcMapped.pData);
unsigned char *destData = reinterpret_cast<unsigned char*>(destMapped.pData);
mipFunction(src->getWidth(), src->getHeight(), src->getDepth(), sourceData, srcMapped.RowPitch, srcMapped.DepthPitch,
destData, destMapped.RowPitch, destMapped.DepthPitch);
dest->unmap();
src->unmap();
dest->markDirty();
}
......
......@@ -19,7 +19,6 @@
#include "libGLESv2/renderer/renderer9_utils.h"
#include "libGLESv2/renderer/formatutils9.h"
#include "libGLESv2/renderer/generatemip.h"
namespace rx
{
......@@ -55,6 +54,9 @@ void Image9::generateMip(IDirect3DSurface9 *destSurface, IDirect3DSurface9 *sour
ASSERT(sourceDesc.Width == 1 || sourceDesc.Width / 2 == destDesc.Width);
ASSERT(sourceDesc.Height == 1 || sourceDesc.Height / 2 == destDesc.Height);
MipGenerationFunction mipFunction = d3d9::GetMipGenerationFunction(sourceDesc.Format);
ASSERT(mipFunction != NULL);
D3DLOCKED_RECT sourceLocked = {0};
result = sourceSurface->LockRect(&sourceLocked, NULL, D3DLOCK_READONLY);
ASSERT(SUCCEEDED(result));
......@@ -68,32 +70,12 @@ void Image9::generateMip(IDirect3DSurface9 *destSurface, IDirect3DSurface9 *sour
if (sourceData && destData)
{
switch (sourceDesc.Format)
{
case D3DFMT_L8:
GenerateMip<L8>(sourceDesc.Width, sourceDesc.Height, 1, sourceData, sourceLocked.Pitch, 0, destData, destLocked.Pitch, 0);
break;
case D3DFMT_A8L8:
GenerateMip<A8L8>(sourceDesc.Width, sourceDesc.Height, 1, sourceData, sourceLocked.Pitch, 0, destData, destLocked.Pitch, 0);
break;
case D3DFMT_A8R8G8B8:
case D3DFMT_X8R8G8B8:
GenerateMip<A8R8G8B8>(sourceDesc.Width, sourceDesc.Height, 1, sourceData, sourceLocked.Pitch, 0, destData, destLocked.Pitch, 0);
break;
case D3DFMT_A16B16G16R16F:
GenerateMip<A16B16G16R16F>(sourceDesc.Width, sourceDesc.Height, 1, sourceData, sourceLocked.Pitch, 0, destData, destLocked.Pitch, 0);
break;
case D3DFMT_A32B32G32R32F:
GenerateMip<A32B32G32R32F>(sourceDesc.Width, sourceDesc.Height, 1, sourceData, sourceLocked.Pitch, 0, destData, destLocked.Pitch, 0);
break;
default:
UNREACHABLE();
break;
}
destSurface->UnlockRect();
sourceSurface->UnlockRect();
mipFunction(sourceDesc.Width, sourceDesc.Height, 1, sourceData, sourceLocked.Pitch, 0,
destData, destLocked.Pitch, 0);
}
destSurface->UnlockRect();
sourceSurface->UnlockRect();
}
Image9 *Image9::makeImage9(Image *img)
......
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