Commit 0c99b1b0 by Geoff Lang

Add functions to check if texture data initialization is required.

Change-Id: I54c3b90780c304d6001b9e52278672981c96cb83 Reviewed-on: https://chromium-review.googlesource.com/176853Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Commit-Queue: Shannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarShannon Woods <shannonwoods@chromium.org>
parent 2916b30e
...@@ -24,6 +24,9 @@ typedef void (*LoadImageFunction)(int width, int height, int depth, ...@@ -24,6 +24,9 @@ typedef void (*LoadImageFunction)(int width, int height, int depth,
const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch, const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch); void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch);
typedef void (*InitializeTextureDataFunction)(int width, int height, int depth,
void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch);
typedef void (*ColorReadFunction)(const void *source, void *dest); typedef void (*ColorReadFunction)(const void *source, void *dest);
typedef void (*ColorWriteFunction)(const void *source, void *dest); typedef void (*ColorWriteFunction)(const void *source, void *dest);
typedef void (*ColorCopyFunction)(const void *source, void *dest); typedef void (*ColorCopyFunction)(const void *source, void *dest);
......
...@@ -758,6 +758,27 @@ static SwizzleInfoMap BuildSwizzleInfoMap() ...@@ -758,6 +758,27 @@ static SwizzleInfoMap BuildSwizzleInfoMap()
return map; return map;
} }
typedef std::pair<GLint, InitializeTextureDataFunction> InternalFormatInitializerPair;
typedef std::map<GLint, InitializeTextureDataFunction> InternalFormatInitializerMap;
static InternalFormatInitializerMap BuildInternalFormatInitializerMap()
{
InternalFormatInitializerMap map;
map.insert(InternalFormatInitializerPair(GL_RGB8, initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF> ));
map.insert(InternalFormatInitializerPair(GL_RGB565, initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF> ));
map.insert(InternalFormatInitializerPair(GL_SRGB8, initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF> ));
map.insert(InternalFormatInitializerPair(GL_RGB16F, initialize4ComponentData<GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One>));
map.insert(InternalFormatInitializerPair(GL_RGB32F, initialize4ComponentData<GLfloat, 0x00000000, 0x00000000, 0x00000000, gl::Float32One>));
map.insert(InternalFormatInitializerPair(GL_RGB8UI, initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0x01> ));
map.insert(InternalFormatInitializerPair(GL_RGB8I, initialize4ComponentData<GLbyte, 0x00, 0x00, 0x00, 0x01> ));
map.insert(InternalFormatInitializerPair(GL_RGB16UI, initialize4ComponentData<GLushort, 0x0000, 0x0000, 0x0000, 0x0001> ));
map.insert(InternalFormatInitializerPair(GL_RGB16I, initialize4ComponentData<GLshort, 0x0000, 0x0000, 0x0000, 0x0001> ));
map.insert(InternalFormatInitializerPair(GL_RGB32UI, initialize4ComponentData<GLuint, 0x00000000, 0x00000000, 0x00000000, 0x00000001> ));
map.insert(InternalFormatInitializerPair(GL_RGB32I, initialize4ComponentData<GLint, 0x00000000, 0x00000000, 0x00000000, 0x00000001> ));
return map;
}
static const SwizzleInfoMap &GetSwizzleInfoMap() static const SwizzleInfoMap &GetSwizzleInfoMap()
{ {
...@@ -794,6 +815,12 @@ static const SwizzleFormatInfo GetSwizzleFormatInfo(GLint internalFormat, GLuint ...@@ -794,6 +815,12 @@ static const SwizzleFormatInfo GetSwizzleFormatInfo(GLint internalFormat, GLuint
} }
} }
static const InternalFormatInitializerMap &GetInternalFormatInitializerMap()
{
static const InternalFormatInitializerMap map = BuildInternalFormatInitializerMap();
return map;
}
namespace d3d11 namespace d3d11
{ {
...@@ -1202,6 +1229,27 @@ DXGI_FORMAT GetSwizzleRTVFormat(GLint internalFormat, const Renderer *renderer) ...@@ -1202,6 +1229,27 @@ DXGI_FORMAT GetSwizzleRTVFormat(GLint internalFormat, const Renderer *renderer)
} }
} }
bool RequiresTextureDataInitialization(GLint internalFormat)
{
const InternalFormatInitializerMap &map = GetInternalFormatInitializerMap();
return map.find(internalFormat) != map.end();
}
InitializeTextureDataFunction GetTextureDataInitializationFunction(GLint internalFormat)
{
const InternalFormatInitializerMap &map = GetInternalFormatInitializerMap();
InternalFormatInitializerMap::const_iterator iter = map.find(internalFormat);
if (iter != map.end())
{
return iter->second;
}
else
{
UNREACHABLE();
return NULL;
}
}
} }
namespace d3d11_gl namespace d3d11_gl
......
...@@ -56,6 +56,9 @@ DXGI_FORMAT GetSwizzleTexFormat(GLint internalFormat, const Renderer *renderer); ...@@ -56,6 +56,9 @@ DXGI_FORMAT GetSwizzleTexFormat(GLint internalFormat, const Renderer *renderer);
DXGI_FORMAT GetSwizzleSRVFormat(GLint internalFormat, const Renderer *renderer); DXGI_FORMAT GetSwizzleSRVFormat(GLint internalFormat, const Renderer *renderer);
DXGI_FORMAT GetSwizzleRTVFormat(GLint internalFormat, const Renderer *renderer); DXGI_FORMAT GetSwizzleRTVFormat(GLint internalFormat, const Renderer *renderer);
bool RequiresTextureDataInitialization(GLint internalFormat);
InitializeTextureDataFunction GetTextureDataInitializationFunction(GLint internalFormat);
} }
namespace d3d11_gl namespace d3d11_gl
......
...@@ -286,6 +286,25 @@ static D3D9FastCopyMap BuildFastCopyMap() ...@@ -286,6 +286,25 @@ static D3D9FastCopyMap BuildFastCopyMap()
return map; return map;
} }
typedef std::pair<GLint, InitializeTextureDataFunction> InternalFormatInitialzerPair;
typedef std::map<GLint, InitializeTextureDataFunction> InternalFormatInitialzerMap;
static InternalFormatInitialzerMap BuildInternalFormatInitialzerMap()
{
InternalFormatInitialzerMap map;
map.insert(InternalFormatInitialzerPair(GL_RGB16F, initialize4ComponentData<GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One>));
map.insert(InternalFormatInitialzerPair(GL_RGB32F, initialize4ComponentData<GLfloat, 0x00000000, 0x00000000, 0x00000000, gl::Float32One>));
return map;
}
static const InternalFormatInitialzerMap &GetInternalFormatInitialzerMap()
{
static const InternalFormatInitialzerMap map = BuildInternalFormatInitialzerMap();
return map;
}
namespace d3d9 namespace d3d9
{ {
...@@ -488,6 +507,27 @@ D3DMULTISAMPLE_TYPE GetMultisampleType(GLsizei samples) ...@@ -488,6 +507,27 @@ D3DMULTISAMPLE_TYPE GetMultisampleType(GLsizei samples)
return (samples > 1) ? static_cast<D3DMULTISAMPLE_TYPE>(samples) : D3DMULTISAMPLE_NONE; return (samples > 1) ? static_cast<D3DMULTISAMPLE_TYPE>(samples) : D3DMULTISAMPLE_NONE;
} }
bool RequiresTextureDataInitialization(GLint internalFormat)
{
const InternalFormatInitialzerMap &map = GetInternalFormatInitialzerMap();
return map.find(internalFormat) != map.end();
}
InitializeTextureDataFunction GetTextureDataInitializationFunction(GLint internalFormat)
{
const InternalFormatInitialzerMap &map = GetInternalFormatInitialzerMap();
InternalFormatInitialzerMap::const_iterator iter = map.find(internalFormat);
if (iter != map.end())
{
return iter->second;
}
else
{
UNREACHABLE();
return NULL;
}
}
} }
namespace d3d9_gl namespace d3d9_gl
......
...@@ -47,6 +47,9 @@ D3DFORMAT GetRenderFormat(GLenum internalFormat, const Renderer9 *renderer); ...@@ -47,6 +47,9 @@ D3DFORMAT GetRenderFormat(GLenum internalFormat, const Renderer9 *renderer);
D3DMULTISAMPLE_TYPE GetMultisampleType(GLsizei samples); D3DMULTISAMPLE_TYPE GetMultisampleType(GLsizei samples);
bool RequiresTextureDataInitialization(GLint internalFormat);
InitializeTextureDataFunction GetTextureDataInitializationFunction(GLint internalFormat);
} }
namespace d3d9_gl namespace d3d9_gl
......
...@@ -310,6 +310,34 @@ void loadUintDataToUshort(int width, int height, int depth, ...@@ -310,6 +310,34 @@ void loadUintDataToUshort(int width, int height, int depth,
const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch, const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch); void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch);
template <typename type, unsigned int firstBits, unsigned int secondBits, unsigned int thirdBits, unsigned int fourthBits>
void initialize4ComponentData(int width, int height, int depth,
void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
{
unsigned int writeBits[4] = { firstBits, secondBits, thirdBits, fourthBits };
type writeValues[4] = { *reinterpret_cast<const type*>(&writeBits[0]),
*reinterpret_cast<const type*>(&writeBits[1]),
*reinterpret_cast<const type*>(&writeBits[2]),
*reinterpret_cast<const type*>(&writeBits[3]) };
for (int z = 0; z < depth; z++)
{
for (int y = 0; y < height; y++)
{
type* destRow = offsetDataPointer<type>(output, y, z, outputRowPitch, outputDepthPitch);
for (int x = 0; x < width; x++)
{
type* destPixel = destRow + x * 4;
// This could potentially be optimized by generating an entire row of initialization
// data and copying row by row instead of pixel by pixel.
memcpy(destPixel, writeValues, sizeof(type) * 4);
}
}
}
}
} }
#endif // LIBGLESV2_RENDERER_LOADIMAGE_H_ #endif // LIBGLESV2_RENDERER_LOADIMAGE_H_
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