Experiment with output callbacks instead of handlers.

This commit is contained in:
castano 2010-05-18 17:13:30 +00:00
parent d38b89edc7
commit a32d780347
5 changed files with 93 additions and 105 deletions

View File

@ -364,7 +364,7 @@ bool Compressor::Private::compress(const InputOptions::Private & inputOptions, c
// Get output handler. // Get output handler.
if (!outputOptions.hasValidOutputHandler()) if (!outputOptions.hasValidOutputHandler())
{ {
if (outputOptions.errorHandler) outputOptions.errorHandler->error(Error_FileOpen); outputOptions.error(Error_FileOpen);
return false; return false;
} }
@ -587,11 +587,7 @@ bool Compressor::Private::outputHeader(const InputOptions::Private & inputOption
if (!supported) if (!supported)
{ {
// This container does not support the requested format. // This container does not support the requested format.
if (outputOptions.errorHandler != NULL) outputOptions.error(Error_UnsupportedOutputFormat);
{
outputOptions.errorHandler->error(Error_UnsupportedOutputFormat);
}
return false; return false;
} }
@ -617,9 +613,9 @@ bool Compressor::Private::outputHeader(const InputOptions::Private & inputOption
} }
bool writeSucceed = outputOptions.outputHandler->writeData(&header, headerSize); bool writeSucceed = outputOptions.outputHandler->writeData(&header, headerSize);
if (!writeSucceed && outputOptions.errorHandler != NULL) if (!writeSucceed)
{ {
outputOptions.errorHandler->error(Error_FileWrite); outputOptions.error(Error_FileWrite);
} }
return writeSucceed; return writeSucceed;
@ -632,14 +628,11 @@ bool Compressor::Private::outputHeader(const TexImage & tex, int mipmapCount, co
{ {
if (tex.width() <= 0 || tex.height() <= 0 || tex.depth() <= 0 || mipmapCount <= 0) if (tex.width() <= 0 || tex.height() <= 0 || tex.depth() <= 0 || mipmapCount <= 0)
{ {
if (outputOptions.errorHandler != NULL) outputOptions.error(Error_InvalidInput);
{
outputOptions.errorHandler->error(Error_InvalidInput);
}
return false; return false;
} }
if (outputOptions.outputHandler == NULL || !outputOptions.outputHeader) if (!outputOptions.outputHeader)
{ {
return true; return true;
} }
@ -831,11 +824,7 @@ bool Compressor::Private::outputHeader(const TexImage & tex, int mipmapCount, co
if (!supported) if (!supported)
{ {
// This container does not support the requested format. // This container does not support the requested format.
if (outputOptions.errorHandler != NULL) outputOptions.error(Error_UnsupportedOutputFormat);
{
outputOptions.errorHandler->error(Error_UnsupportedOutputFormat);
}
return false; return false;
} }
@ -861,9 +850,9 @@ bool Compressor::Private::outputHeader(const TexImage & tex, int mipmapCount, co
} }
bool writeSucceed = outputOptions.outputHandler->writeData(&header, headerSize); bool writeSucceed = outputOptions.outputHandler->writeData(&header, headerSize);
if (!writeSucceed && outputOptions.errorHandler != NULL) if (!writeSucceed)
{ {
outputOptions.errorHandler->error(Error_FileWrite); outputOptions.error(Error_FileWrite);
} }
return writeSucceed; return writeSucceed;
@ -886,19 +875,13 @@ bool Compressor::Private::compressMipmaps(uint f, const InputOptions::Private &
for (uint m = 0; m < mipmapCount; m++) for (uint m = 0; m < mipmapCount; m++)
{ {
if (outputOptions.outputHandler) int size = computeImageSize(w, h, d, compressionOptions.getBitCount(), compressionOptions.format);
{ outputOptions.beginImage(size, w, h, d, f, m);
int size = computeImageSize(w, h, d, compressionOptions.getBitCount(), compressionOptions.format);
outputOptions.outputHandler->beginImage(size, w, h, d, f, m);
}
if (!initMipmap(mipmap, inputOptions, w, h, d, f, m)) if (!initMipmap(mipmap, inputOptions, w, h, d, f, m))
{ {
if (outputOptions.errorHandler != NULL) outputOptions.error(Error_InvalidInput);
{ return false;
outputOptions.errorHandler->error(Error_InvalidInput);
return false;
}
} }
if (compressionOptions.pixelType == PixelType_Float) if (compressionOptions.pixelType == PixelType_Float)
@ -1515,7 +1498,7 @@ bool Compressor::Private::compress2D(InputFormat inputFormat, AlphaMode alphaMod
if (compressor == NULL) if (compressor == NULL)
{ {
if (outputOptions.errorHandler) outputOptions.errorHandler->error(Error_UnsupportedFeature); outputOptions.error(Error_UnsupportedFeature);
} }
else else
{ {

View File

@ -26,6 +26,22 @@
using namespace nvtt; using namespace nvtt;
static void defaultBeginImageCallback(int size, int width, int height, int depth, int face, int miplevel, void * userData) {
nvtt::OutputHandler * outputHandler = (nvtt::OutputHandler *)userData;
if (outputHandler != NULL) outputHandler->beginImage(size, width, height, depth, face, miplevel);
}
static bool defaultOutputCallback(const void * data, int size, void * userData) {
nvtt::OutputHandler * outputHandler = (nvtt::OutputHandler *)userData;
if (outputHandler != NULL) return outputHandler->writeData(data, size);
}
static void defaultErrorCallback(Error e, void * userData) {
nvtt::ErrorHandler * errorHandler = (nvtt::ErrorHandler *)userData;
if (errorHandler != NULL) errorHandler->error(e);
}
OutputOptions::OutputOptions() : m(*new OutputOptions::Private()) OutputOptions::OutputOptions() : m(*new OutputOptions::Private())
{ {
reset(); reset();
@ -43,8 +59,14 @@ OutputOptions::~OutputOptions()
void OutputOptions::reset() void OutputOptions::reset()
{ {
m.fileName.reset(); m.fileName.reset();
m.outputHandler = NULL; m.outputHandler = NULL;
m.errorHandler = NULL; m.errorHandler = NULL;
m.beginImageCallback = defaultBeginImageCallback;
m.outputCallback = defaultOutputCallback;
m.errorCallback = defaultErrorCallback;
m.outputHeader = true; m.outputHeader = true;
m.container = Container_DDS; m.container = Container_DDS;
} }
@ -61,6 +83,7 @@ void OutputOptions::setFileName(const char * fileName)
{ {
m.outputHandler = oh; m.outputHandler = oh;
} }
m.outputCallback = defaultOutputCallback;
} }
/// Set output handler. /// Set output handler.
@ -72,6 +95,7 @@ void OutputOptions::setOutputHandler(OutputHandler * outputHandler)
m.fileName.reset(); m.fileName.reset();
} }
m.outputHandler = outputHandler; m.outputHandler = outputHandler;
m.outputCallback = defaultOutputCallback;
} }
/// Set error handler. /// Set error handler.
@ -103,3 +127,17 @@ bool OutputOptions::Private::hasValidOutputHandler() const
return true; return true;
} }
void OutputOptions::Private::beginImage(int size, int width, int height, int depth, int face, int miplevel) const
{
beginImageCallback(size, width, height, depth, face, miplevel, outputHandler);
}
bool OutputOptions::Private::writeData(const void * data, int size) const
{
return outputCallback(data, size, outputHandler);
}
void OutputOptions::Private::error(Error e) const
{
errorCallback(e, errorHandler);
}

View File

@ -55,18 +55,27 @@ namespace nvtt
nv::StdOutputStream stream; nv::StdOutputStream stream;
}; };
struct OutputOptions::Private struct OutputOptions::Private
{ {
nv::Path fileName; nv::Path fileName;
OutputHandler * outputHandler; OutputHandler * outputHandler;
ErrorHandler * errorHandler; ErrorHandler * errorHandler;
BeginImageCallback * beginImageCallback;
OutputCallback * outputCallback;
ErrorCallback * errorCallback;
bool outputHeader; bool outputHeader;
Container container; Container container;
bool hasValidOutputHandler() const; bool hasValidOutputHandler() const;
void beginImage(int size, int width, int height, int depth, int face, int miplevel) const;
bool writeData(const void * data, int size) const;
void error(Error e) const;
}; };

View File

@ -199,17 +199,11 @@ void CudaCompressor::compress(nvtt::InputFormat inputFormat, nvtt::AlphaMode alp
if (err != cudaSuccess) if (err != cudaSuccess)
{ {
//nvDebug("CUDA Error: %s\n", cudaGetErrorString(err)); //nvDebug("CUDA Error: %s\n", cudaGetErrorString(err));
if (outputOptions.errorHandler != NULL) outputOptions.error(Error_CudaError);
{
outputOptions.errorHandler->error(Error_CudaError);
}
} }
// Output result. // Output result.
if (outputOptions.outputHandler != NULL) outputOptions.writeData(h_result, count * bs);
{
outputOptions.outputHandler->writeData(h_result, count * bs);
}
bn += count; bn += count;
} }
@ -221,10 +215,7 @@ void CudaCompressor::compress(nvtt::InputFormat inputFormat, nvtt::AlphaMode alp
cudaFreeArray(d_image); cudaFreeArray(d_image);
#else #else
if (outputOptions.errorHandler != NULL) outputOptions.error(Error_CudaError);
{
outputOptions.errorHandler->error(Error_CudaError);
}
#endif #endif
} }
@ -362,24 +353,17 @@ void CudaCompressor::compressDXT3(const CompressionOptions::Private & compressio
if (err != cudaSuccess) if (err != cudaSuccess)
{ {
nvDebug("CUDA Error: %s\n", cudaGetErrorString(err)); nvDebug("CUDA Error: %s\n", cudaGetErrorString(err));
outputOptions.error(Error_CudaError);
if (outputOptions.errorHandler != NULL)
{
outputOptions.errorHandler->error(Error_CudaError);
}
} }
// Copy result to host, overwrite swizzled image. // Copy result to host, overwrite swizzled image.
cudaMemcpy(blockLinearImage, m_ctx.result, count * 8, cudaMemcpyDeviceToHost); cudaMemcpy(blockLinearImage, m_ctx.result, count * 8, cudaMemcpyDeviceToHost);
// Output result. // Output result.
if (outputOptions.outputHandler != NULL) for (uint i = 0; i < count; i++)
{ {
for (uint i = 0; i < count; i++) outputOptions.writeData(alphaBlocks + i, 8);
{ outputOptions.writeData(blockLinearImage + i * 2, 8);
outputOptions.outputHandler->writeData(alphaBlocks + i, 8);
outputOptions.outputHandler->writeData(blockLinearImage + i * 2, 8);
}
} }
bn += count; bn += count;
@ -392,10 +376,7 @@ void CudaCompressor::compressDXT3(const CompressionOptions::Private & compressio
free(blockLinearImage); free(blockLinearImage);
#else #else
if (outputOptions.errorHandler != NULL) outputOptions.error(Error_CudaError);
{
outputOptions.errorHandler->error(Error_CudaError);
}
#endif #endif
} }
@ -453,24 +434,17 @@ void CudaCompressor::compressDXT5(const CompressionOptions::Private & compressio
if (err != cudaSuccess) if (err != cudaSuccess)
{ {
nvDebug("CUDA Error: %s\n", cudaGetErrorString(err)); nvDebug("CUDA Error: %s\n", cudaGetErrorString(err));
outputOptions.error(Error_CudaError);
if (outputOptions.errorHandler != NULL)
{
outputOptions.errorHandler->error(Error_CudaError);
}
} }
// Copy result to host, overwrite swizzled image. // Copy result to host, overwrite swizzled image.
cudaMemcpy(blockLinearImage, m_ctx.result, count * 8, cudaMemcpyDeviceToHost); cudaMemcpy(blockLinearImage, m_ctx.result, count * 8, cudaMemcpyDeviceToHost);
// Output result. // Output result.
if (outputOptions.outputHandler != NULL) for (uint i = 0; i < count; i++)
{ {
for (uint i = 0; i < count; i++) outputOptions.writeData(alphaBlocks + i, 8);
{ outputOptions.writeData(blockLinearImage + i * 2, 8);
outputOptions.outputHandler->writeData(alphaBlocks + i, 8);
outputOptions.outputHandler->writeData(blockLinearImage + i * 2, 8);
}
} }
bn += count; bn += count;
@ -483,10 +457,7 @@ void CudaCompressor::compressDXT5(const CompressionOptions::Private & compressio
free(blockLinearImage); free(blockLinearImage);
#else #else
if (outputOptions.errorHandler != NULL) outputOptions.error(Error_CudaError);
{
outputOptions.errorHandler->error(Error_CudaError);
}
#endif #endif
} }
@ -527,21 +498,14 @@ void CudaCompressor::compressDXT1n(const nvtt::CompressionOptions::Private & com
if (err != cudaSuccess) if (err != cudaSuccess)
{ {
nvDebug("CUDA Error: %s\n", cudaGetErrorString(err)); nvDebug("CUDA Error: %s\n", cudaGetErrorString(err));
outputOptions.error(Error_CudaError);
if (outputOptions.errorHandler != NULL)
{
outputOptions.errorHandler->error(Error_CudaError);
}
} }
// Copy result to host, overwrite swizzled image. // Copy result to host, overwrite swizzled image.
cudaMemcpy(blockLinearImage, m_ctx.result, count * 8, cudaMemcpyDeviceToHost); cudaMemcpy(blockLinearImage, m_ctx.result, count * 8, cudaMemcpyDeviceToHost);
// Output result. // Output result.
if (outputOptions.outputHandler != NULL) outputOptions.writeData(blockLinearImage, count * 8);
{
outputOptions.outputHandler->writeData(blockLinearImage, count * 8);
}
bn += count; bn += count;
} }
@ -552,10 +516,7 @@ void CudaCompressor::compressDXT1n(const nvtt::CompressionOptions::Private & com
free(blockLinearImage); free(blockLinearImage);
#else #else
if (outputOptions.errorHandler != NULL) outputOptions.error(Error_CudaError);
{
outputOptions.errorHandler->error(Error_CudaError);
}
#endif #endif
} }
@ -597,20 +558,14 @@ void CudaCompressor::compressCTX1(const nvtt::CompressionOptions::Private & comp
{ {
nvDebug("CUDA Error: %s\n", cudaGetErrorString(err)); nvDebug("CUDA Error: %s\n", cudaGetErrorString(err));
if (outputOptions.errorHandler != NULL) outputOptions.error(Error_CudaError);
{
outputOptions.errorHandler->error(Error_CudaError);
}
} }
// Copy result to host, overwrite swizzled image. // Copy result to host, overwrite swizzled image.
cudaMemcpy(blockLinearImage, m_ctx.result, count * 8, cudaMemcpyDeviceToHost); cudaMemcpy(blockLinearImage, m_ctx.result, count * 8, cudaMemcpyDeviceToHost);
// Output result. // Output result.
if (outputOptions.outputHandler != NULL) outputOptions.writeData(blockLinearImage, count * 8);
{
outputOptions.outputHandler->writeData(blockLinearImage, count * 8);
}
bn += count; bn += count;
} }
@ -621,10 +576,7 @@ void CudaCompressor::compressCTX1(const nvtt::CompressionOptions::Private & comp
free(blockLinearImage); free(blockLinearImage);
#else #else
if (outputOptions.errorHandler != NULL) outputOptions.error(Error_CudaError);
{
outputOptions.errorHandler->error(Error_CudaError);
}
#endif #endif
} }
@ -637,13 +589,10 @@ void CudaCompressor::compressDXT5n(const nvtt::CompressionOptions::Private & com
// @@ TODO // @@ TODO
#else #else
if (outputOptions.errorHandler != NULL) outputOptions.error(Error_CudaError);
{
outputOptions.errorHandler->error(Error_CudaError);
}
#endif #endif
} }
#endif // 0 #endif // 0
#endif // defined HAVE_CUDA #endif // defined HAVE_CUDA

View File

@ -316,6 +316,10 @@ namespace nvtt
virtual void error(Error e) = 0; virtual void error(Error e) = 0;
}; };
typedef void (BeginImageCallback)(int size, int width, int height, int depth, int face, int miplevel, void *);
typedef bool (OutputCallback)(const void * data, int size, void *);
typedef void (ErrorCallback)(Error e, void *);
/// Container. /// Container.
enum Container enum Container
{ {
@ -341,6 +345,11 @@ namespace nvtt
NVTT_API void setOutputHandler(OutputHandler * outputHandler); NVTT_API void setOutputHandler(OutputHandler * outputHandler);
NVTT_API void setErrorHandler(ErrorHandler * errorHandler); NVTT_API void setErrorHandler(ErrorHandler * errorHandler);
NVTT_API void setBeginImageCallback(BeginImageCallback * beginImageCallback);
NVTT_API void setOutputCallback(OutputCallback * outputCallback);
NVTT_API void setErrorCallback(ErrorCallback * errorCallback);
NVTT_API void setOutputHeader(bool outputHeader); NVTT_API void setOutputHeader(bool outputHeader);
NVTT_API void setContainer(Container container); NVTT_API void setContainer(Container container);
}; };