diff --git a/src/nvtt/Context.cpp b/src/nvtt/Context.cpp index deaff3a..f0a1773 100644 --- a/src/nvtt/Context.cpp +++ b/src/nvtt/Context.cpp @@ -364,7 +364,7 @@ bool Compressor::Private::compress(const InputOptions::Private & inputOptions, c // Get output handler. if (!outputOptions.hasValidOutputHandler()) { - if (outputOptions.errorHandler) outputOptions.errorHandler->error(Error_FileOpen); + outputOptions.error(Error_FileOpen); return false; } @@ -587,11 +587,7 @@ bool Compressor::Private::outputHeader(const InputOptions::Private & inputOption if (!supported) { // This container does not support the requested format. - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_UnsupportedOutputFormat); - } - + outputOptions.error(Error_UnsupportedOutputFormat); return false; } @@ -617,9 +613,9 @@ bool Compressor::Private::outputHeader(const InputOptions::Private & inputOption } 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; @@ -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 (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_InvalidInput); - } + outputOptions.error(Error_InvalidInput); return false; } - if (outputOptions.outputHandler == NULL || !outputOptions.outputHeader) + if (!outputOptions.outputHeader) { return true; } @@ -831,11 +824,7 @@ bool Compressor::Private::outputHeader(const TexImage & tex, int mipmapCount, co if (!supported) { // This container does not support the requested format. - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_UnsupportedOutputFormat); - } - + outputOptions.error(Error_UnsupportedOutputFormat); return false; } @@ -861,9 +850,9 @@ bool Compressor::Private::outputHeader(const TexImage & tex, int mipmapCount, co } 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; @@ -886,19 +875,13 @@ bool Compressor::Private::compressMipmaps(uint f, const InputOptions::Private & for (uint m = 0; m < mipmapCount; m++) { - if (outputOptions.outputHandler) - { - int size = computeImageSize(w, h, d, compressionOptions.getBitCount(), compressionOptions.format); - outputOptions.outputHandler->beginImage(size, w, h, d, f, m); - } + int size = computeImageSize(w, h, d, compressionOptions.getBitCount(), compressionOptions.format); + outputOptions.beginImage(size, w, h, d, f, m); if (!initMipmap(mipmap, inputOptions, w, h, d, f, m)) { - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_InvalidInput); - return false; - } + outputOptions.error(Error_InvalidInput); + return false; } if (compressionOptions.pixelType == PixelType_Float) @@ -1515,7 +1498,7 @@ bool Compressor::Private::compress2D(InputFormat inputFormat, AlphaMode alphaMod if (compressor == NULL) { - if (outputOptions.errorHandler) outputOptions.errorHandler->error(Error_UnsupportedFeature); + outputOptions.error(Error_UnsupportedFeature); } else { diff --git a/src/nvtt/OutputOptions.cpp b/src/nvtt/OutputOptions.cpp index c02719e..095d344 100644 --- a/src/nvtt/OutputOptions.cpp +++ b/src/nvtt/OutputOptions.cpp @@ -26,6 +26,22 @@ 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()) { reset(); @@ -43,8 +59,14 @@ OutputOptions::~OutputOptions() void OutputOptions::reset() { m.fileName.reset(); + m.outputHandler = NULL; m.errorHandler = NULL; + + m.beginImageCallback = defaultBeginImageCallback; + m.outputCallback = defaultOutputCallback; + m.errorCallback = defaultErrorCallback; + m.outputHeader = true; m.container = Container_DDS; } @@ -61,6 +83,7 @@ void OutputOptions::setFileName(const char * fileName) { m.outputHandler = oh; } + m.outputCallback = defaultOutputCallback; } /// Set output handler. @@ -72,6 +95,7 @@ void OutputOptions::setOutputHandler(OutputHandler * outputHandler) m.fileName.reset(); } m.outputHandler = outputHandler; + m.outputCallback = defaultOutputCallback; } /// Set error handler. @@ -103,3 +127,17 @@ bool OutputOptions::Private::hasValidOutputHandler() const 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); +} diff --git a/src/nvtt/OutputOptions.h b/src/nvtt/OutputOptions.h index d90e8bd..7548bae 100644 --- a/src/nvtt/OutputOptions.h +++ b/src/nvtt/OutputOptions.h @@ -55,18 +55,27 @@ namespace nvtt nv::StdOutputStream stream; }; - - + + struct OutputOptions::Private { nv::Path fileName; OutputHandler * outputHandler; ErrorHandler * errorHandler; + + BeginImageCallback * beginImageCallback; + OutputCallback * outputCallback; + ErrorCallback * errorCallback; + bool outputHeader; Container container; 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; }; diff --git a/src/nvtt/cuda/CudaCompressorDXT.cpp b/src/nvtt/cuda/CudaCompressorDXT.cpp index a81a0c7..452480a 100644 --- a/src/nvtt/cuda/CudaCompressorDXT.cpp +++ b/src/nvtt/cuda/CudaCompressorDXT.cpp @@ -199,17 +199,11 @@ void CudaCompressor::compress(nvtt::InputFormat inputFormat, nvtt::AlphaMode alp if (err != cudaSuccess) { //nvDebug("CUDA Error: %s\n", cudaGetErrorString(err)); - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_CudaError); - } + outputOptions.error(Error_CudaError); } // Output result. - if (outputOptions.outputHandler != NULL) - { - outputOptions.outputHandler->writeData(h_result, count * bs); - } + outputOptions.writeData(h_result, count * bs); bn += count; } @@ -221,10 +215,7 @@ void CudaCompressor::compress(nvtt::InputFormat inputFormat, nvtt::AlphaMode alp cudaFreeArray(d_image); #else - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_CudaError); - } + outputOptions.error(Error_CudaError); #endif } @@ -362,24 +353,17 @@ void CudaCompressor::compressDXT3(const CompressionOptions::Private & compressio if (err != cudaSuccess) { nvDebug("CUDA Error: %s\n", cudaGetErrorString(err)); - - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_CudaError); - } + outputOptions.error(Error_CudaError); } // Copy result to host, overwrite swizzled image. cudaMemcpy(blockLinearImage, m_ctx.result, count * 8, cudaMemcpyDeviceToHost); // Output result. - if (outputOptions.outputHandler != NULL) + for (uint i = 0; i < count; i++) { - for (uint i = 0; i < count; i++) - { - outputOptions.outputHandler->writeData(alphaBlocks + i, 8); - outputOptions.outputHandler->writeData(blockLinearImage + i * 2, 8); - } + outputOptions.writeData(alphaBlocks + i, 8); + outputOptions.writeData(blockLinearImage + i * 2, 8); } bn += count; @@ -392,10 +376,7 @@ void CudaCompressor::compressDXT3(const CompressionOptions::Private & compressio free(blockLinearImage); #else - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_CudaError); - } + outputOptions.error(Error_CudaError); #endif } @@ -453,24 +434,17 @@ void CudaCompressor::compressDXT5(const CompressionOptions::Private & compressio if (err != cudaSuccess) { nvDebug("CUDA Error: %s\n", cudaGetErrorString(err)); - - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_CudaError); - } + outputOptions.error(Error_CudaError); } // Copy result to host, overwrite swizzled image. cudaMemcpy(blockLinearImage, m_ctx.result, count * 8, cudaMemcpyDeviceToHost); // Output result. - if (outputOptions.outputHandler != NULL) + for (uint i = 0; i < count; i++) { - for (uint i = 0; i < count; i++) - { - outputOptions.outputHandler->writeData(alphaBlocks + i, 8); - outputOptions.outputHandler->writeData(blockLinearImage + i * 2, 8); - } + outputOptions.writeData(alphaBlocks + i, 8); + outputOptions.writeData(blockLinearImage + i * 2, 8); } bn += count; @@ -483,10 +457,7 @@ void CudaCompressor::compressDXT5(const CompressionOptions::Private & compressio free(blockLinearImage); #else - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_CudaError); - } + outputOptions.error(Error_CudaError); #endif } @@ -527,21 +498,14 @@ void CudaCompressor::compressDXT1n(const nvtt::CompressionOptions::Private & com if (err != cudaSuccess) { nvDebug("CUDA Error: %s\n", cudaGetErrorString(err)); - - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_CudaError); - } + outputOptions.error(Error_CudaError); } // Copy result to host, overwrite swizzled image. cudaMemcpy(blockLinearImage, m_ctx.result, count * 8, cudaMemcpyDeviceToHost); // Output result. - if (outputOptions.outputHandler != NULL) - { - outputOptions.outputHandler->writeData(blockLinearImage, count * 8); - } + outputOptions.writeData(blockLinearImage, count * 8); bn += count; } @@ -552,10 +516,7 @@ void CudaCompressor::compressDXT1n(const nvtt::CompressionOptions::Private & com free(blockLinearImage); #else - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_CudaError); - } + outputOptions.error(Error_CudaError); #endif } @@ -597,20 +558,14 @@ void CudaCompressor::compressCTX1(const nvtt::CompressionOptions::Private & comp { nvDebug("CUDA Error: %s\n", cudaGetErrorString(err)); - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_CudaError); - } + outputOptions.error(Error_CudaError); } // Copy result to host, overwrite swizzled image. cudaMemcpy(blockLinearImage, m_ctx.result, count * 8, cudaMemcpyDeviceToHost); // Output result. - if (outputOptions.outputHandler != NULL) - { - outputOptions.outputHandler->writeData(blockLinearImage, count * 8); - } + outputOptions.writeData(blockLinearImage, count * 8); bn += count; } @@ -621,10 +576,7 @@ void CudaCompressor::compressCTX1(const nvtt::CompressionOptions::Private & comp free(blockLinearImage); #else - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_CudaError); - } + outputOptions.error(Error_CudaError); #endif } @@ -637,13 +589,10 @@ void CudaCompressor::compressDXT5n(const nvtt::CompressionOptions::Private & com // @@ TODO #else - if (outputOptions.errorHandler != NULL) - { - outputOptions.errorHandler->error(Error_CudaError); - } + outputOptions.error(Error_CudaError); #endif } #endif // 0 -#endif // defined HAVE_CUDA \ No newline at end of file +#endif // defined HAVE_CUDA diff --git a/src/nvtt/nvtt.h b/src/nvtt/nvtt.h index f484e78..a0e272d 100644 --- a/src/nvtt/nvtt.h +++ b/src/nvtt/nvtt.h @@ -316,6 +316,10 @@ namespace nvtt 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. enum Container { @@ -341,6 +345,11 @@ namespace nvtt NVTT_API void setOutputHandler(OutputHandler * outputHandler); 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 setContainer(Container container); };