diff --git a/applications/_plugins/ccmp_encode/hpc/ccpu_hpc.cpp b/applications/_plugins/ccmp_encode/hpc/ccpu_hpc.cpp index 4c55c7c53..2475176af 100644 --- a/applications/_plugins/ccmp_encode/hpc/ccpu_hpc.cpp +++ b/applications/_plugins/ccmp_encode/hpc/ccpu_hpc.cpp @@ -107,7 +107,7 @@ CMP_ERROR Plugin_CCPU_HPC::TC_GetDeviceInfo(void* pDeviceInfo) } // TODO: For the future, this can be simplified if srcTexture was passed by value instead of reference -CMP_ERROR Plugin_CCPU_HPC::TC_Compress(void* options, MipSet& srcTexture, MipSet& destTexture, CMP_Feedback_Proc pFeedback) +CMP_ERROR Plugin_CCPU_HPC::TC_Compress(void* options, MipSet& srcTexture, MipSet& destTexture, CMP_Feedback_Proc pFeedback, CMP_DWORD_PTR pUser1, CMP_DWORD_PTR pUser2) { CMP_ERROR result = CMP_OK; @@ -124,7 +124,7 @@ CMP_ERROR Plugin_CCPU_HPC::TC_Compress(void* options, MipSet& srcTexture, MipSet #endif if (m_pComputeBase) - result = m_pComputeBase->Compress((KernelOptions*)options, srcTexture, destTexture, pFeedback); + result = m_pComputeBase->Compress((KernelOptions*)options, srcTexture, destTexture, pFeedback, pUser1, pUser2); #ifdef ENABLE_MAKE_COMPATIBLE_API if (tempBuffer.isBufferNew) diff --git a/applications/_plugins/ccmp_encode/hpc/ccpu_hpc.h b/applications/_plugins/ccmp_encode/hpc/ccpu_hpc.h index be139b2f8..858d558ef 100644 --- a/applications/_plugins/ccmp_encode/hpc/ccpu_hpc.h +++ b/applications/_plugins/ccmp_encode/hpc/ccpu_hpc.h @@ -59,7 +59,7 @@ class Plugin_CCPU_HPC : public PluginInterface_Pipeline int TC_PluginGetVersion(TC_PluginVersion* pPluginVersion); int TC_Init(void* kernel_options); int TC_PluginSetSharedIO(void* Shared); - CMP_ERROR TC_Compress(void* kernel_options, MipSet& SrcTexture, MipSet& destTexture, CMP_Feedback_Proc pFeedback); + CMP_ERROR TC_Compress(void* kernel_options, MipSet& SrcTexture, MipSet& destTexture, CMP_Feedback_Proc pFeedback, CMP_DWORD_PTR pUser1, CMP_DWORD_PTR pUser2); void TC_SetComputeOptions(void* options); char* TC_ComputeSourceFile(); CMP_ERROR TC_GetPerformanceStats(void* pPerfStats); diff --git a/applications/_plugins/ccmp_encode/hpc/compute_cpu_hpc.cpp b/applications/_plugins/ccmp_encode/hpc/compute_cpu_hpc.cpp index 476371281..20359a102 100644 --- a/applications/_plugins/ccmp_encode/hpc/compute_cpu_hpc.cpp +++ b/applications/_plugins/ccmp_encode/hpc/compute_cpu_hpc.cpp @@ -337,7 +337,7 @@ void CompressTexture(const texture_surface* input, unsigned char* output) g_plugin_compute->CompressTexture((void*)input, (void*)output, nullptr); } -CMP_ERROR CCPU_HPC::Compress(KernelOptions* Options, MipSet& SrcTexture, MipSet& destTexture, CMP_Feedback_Proc pFeedback) +CMP_ERROR CCPU_HPC::Compress(KernelOptions* Options, MipSet& SrcTexture, MipSet& destTexture, CMP_Feedback_Proc pFeedback, CMP_DWORD_PTR pUser1, CMP_DWORD_PTR pUser2) { if (m_plugin_compute == NULL) return (CMP_ERR_UNABLE_TO_INIT_COMPUTELIB); @@ -488,7 +488,7 @@ CMP_ERROR CCPU_HPC::Compress(KernelOptions* Options, MipSet& SrcTexture, MipSet& if (progress_old != progress) { progress_old = progress; - if (pFeedback(progress * 100.0f, NULL, NULL)) + if (pFeedback(progress * 100.0f, pUser1, pUser2)) { break; } diff --git a/applications/_plugins/ccmp_encode/hpc/compute_cpu_hpc.h b/applications/_plugins/ccmp_encode/hpc/compute_cpu_hpc.h index 7081cf910..203915b97 100644 --- a/applications/_plugins/ccmp_encode/hpc/compute_cpu_hpc.h +++ b/applications/_plugins/ccmp_encode/hpc/compute_cpu_hpc.h @@ -55,7 +55,7 @@ class CCPU_HPC : public ComputeBase public: CCPU_HPC(void* kerneloptions); ~CCPU_HPC(); - CMP_ERROR Compress(KernelOptions* Options, MipSet& SrcTexture, MipSet& destTexture, CMP_Feedback_Proc pFeedback); + CMP_ERROR Compress(KernelOptions* Options, MipSet& SrcTexture, MipSet& destTexture, CMP_Feedback_Proc pFeedback, CMP_DWORD_PTR pUser1, CMP_DWORD_PTR pUser2); void SetComputeOptions(ComputeOptions* CLOptions); float GetProcessElapsedTimeMS(); float GetMTxPerSec(); diff --git a/applications/_plugins/common/cmp_plugininterface.h b/applications/_plugins/common/cmp_plugininterface.h index 9c3f1ab49..eebad19b8 100644 --- a/applications/_plugins/common/cmp_plugininterface.h +++ b/applications/_plugins/common/cmp_plugininterface.h @@ -150,7 +150,7 @@ class PluginInterface_Pipeline : PluginBase virtual int TC_PluginGetVersion(TC_PluginVersion* pPluginVersion) = 0; virtual int TC_PluginSetSharedIO(void* Shared) = 0; virtual int TC_Init(void* kernel_options) = 0; - virtual CMP_ERROR TC_Compress(void* kernel_options, MipSet& SrcTexture, MipSet& destTexture, CMP_Feedback_Proc pFeedbackProc = NULL) = 0; + virtual CMP_ERROR TC_Compress(void* kernel_options, MipSet& SrcTexture, MipSet& destTexture, CMP_Feedback_Proc pFeedbackProc = NULL, CMP_DWORD_PTR pUser1 = NULL, CMP_DWORD_PTR pUser2 = NULL) = 0; virtual void TC_SetComputeOptions(void* options) = 0; virtual char* TC_ComputeSourceFile() = 0; virtual CMP_ERROR TC_GetPerformanceStats(void* pPerfStats) = 0; diff --git a/cmp_compressonatorlib/common/compress.h b/cmp_compressonatorlib/common/compress.h index c11c0145c..67e0a9c48 100644 --- a/cmp_compressonatorlib/common/compress.h +++ b/cmp_compressonatorlib/common/compress.h @@ -56,13 +56,15 @@ // TODO: This probably shouldn't be defined in compress.cpp CMP_INT CMP_GetNumberOfProcessors(); -CMP_ERROR CodecCompressTexture(const CMP_Texture* srcTexture, CMP_Texture* destTexture, const CMP_CompressOptions* options, CMP_Feedback_Proc feedbackProc); +CMP_ERROR CodecCompressTexture(const CMP_Texture* srcTexture, CMP_Texture* destTexture, const CMP_CompressOptions* options, CMP_Feedback_Proc feedbackProc, CMP_DWORD_PTR user1, CMP_DWORD_PTR user2); CMP_ERROR CodecCompressTextureThreaded(const CMP_Texture* srcTexture, CMP_Texture* destTexture, const CMP_CompressOptions* options, - CMP_Feedback_Proc feedbackProc); + CMP_Feedback_Proc feedbackProc, + CMP_DWORD_PTR user1, + CMP_DWORD_PTR user2); -CMP_ERROR CodecDecompressTexture(const CMP_Texture* srcTexture, CMP_Texture* destTexture, const CMP_CompressOptions* options, CMP_Feedback_Proc feedbackProc); +CMP_ERROR CodecDecompressTexture(const CMP_Texture* srcTexture, CMP_Texture* destTexture, const CMP_CompressOptions* options, CMP_Feedback_Proc feedbackProc, CMP_DWORD_PTR user1, CMP_DWORD_PTR user2); #endif // !COMPRESS_H diff --git a/cmp_compressonatorlib/compress.cpp b/cmp_compressonatorlib/compress.cpp index 972ec263b..3909fe6ef 100644 --- a/cmp_compressonatorlib/compress.cpp +++ b/cmp_compressonatorlib/compress.cpp @@ -189,7 +189,7 @@ static void CMP_PrepareCMPSourceForIMG_Destination(CMP_Texture* destTexture, CMP #endif -CMP_ERROR CodecCompressTexture(const CMP_Texture* srcTexture, CMP_Texture* destTexture, const CMP_CompressOptions* options, CMP_Feedback_Proc feedbackProc) +CMP_ERROR CodecCompressTexture(const CMP_Texture* srcTexture, CMP_Texture* destTexture, const CMP_CompressOptions* options, CMP_Feedback_Proc feedbackProc, CMP_DWORD_PTR user1, CMP_DWORD_PTR user2) { CodecType destType = GetCodecType(destTexture->format); if (destType == CT_Unknown) @@ -370,7 +370,7 @@ CMP_ERROR CodecCompressTexture(const CMP_Texture* srcTexture, CMP_Texture* destT srcBuffer->m_bSwizzle = swizzleSrcBuffer; DISABLE_FP_EXCEPTIONS; - CodecError err = codec->Compress(*srcBuffer, *destBuffer, feedbackProc); + CodecError err = codec->Compress(*srcBuffer, *destBuffer, feedbackProc, user1, user2); RESTORE_FP_EXCEPTIONS; destTexture->dwDataSize = destBuffer->GetDataSize(); @@ -382,7 +382,7 @@ CMP_ERROR CodecCompressTexture(const CMP_Texture* srcTexture, CMP_Texture* destT return GetError(err); } -CMP_ERROR CodecDecompressTexture(const CMP_Texture* srcTexture, CMP_Texture* destTexture, const CMP_CompressOptions* options, CMP_Feedback_Proc feedbackProc) +CMP_ERROR CodecDecompressTexture(const CMP_Texture* srcTexture, CMP_Texture* destTexture, const CMP_CompressOptions* options, CMP_Feedback_Proc feedbackProc, CMP_DWORD_PTR user1, CMP_DWORD_PTR user2) { CodecType srcType = GetCodecType(srcTexture->format); if (srcType == CT_Unknown) @@ -448,7 +448,7 @@ CMP_ERROR CodecDecompressTexture(const CMP_Texture* srcTexture, CMP_Texture* des destBuffer->SetBlockDepth(destTexture->nBlockDepth); destBuffer->SetFormat(destTexture->format); - CodecError err1 = codec->Decompress(*srcBuffer, *destBuffer, feedbackProc); + CodecError err1 = codec->Decompress(*srcBuffer, *destBuffer, feedbackProc, user1, user2); RESTORE_FP_EXCEPTIONS; @@ -477,6 +477,8 @@ class CATICompressThreadData CCodecBuffer* m_pSrcBuffer; CCodecBuffer* m_pDestBuffer; CMP_Feedback_Proc m_pFeedbackProc; + CMP_DWORD_PTR m_pUser1; + CMP_DWORD_PTR m_pUser2; CodecError m_errorCode; }; @@ -485,6 +487,8 @@ CATICompressThreadData::CATICompressThreadData() , m_pSrcBuffer(NULL) , m_pDestBuffer(NULL) , m_pFeedbackProc(NULL) + , m_pUser1(NULL) + , m_pUser2(NULL) , m_errorCode(CE_OK) { } @@ -500,7 +504,7 @@ void ThreadedCompressProc(void* lpParameter) { CATICompressThreadData* pThreadData = (CATICompressThreadData*)lpParameter; DISABLE_FP_EXCEPTIONS; - CodecError err = pThreadData->m_pCodec->Compress(*pThreadData->m_pSrcBuffer, *pThreadData->m_pDestBuffer, pThreadData->m_pFeedbackProc); + CodecError err = pThreadData->m_pCodec->Compress(*pThreadData->m_pSrcBuffer, *pThreadData->m_pDestBuffer, pThreadData->m_pFeedbackProc, pThreadData->m_pUser1, pThreadData->m_pUser2); RESTORE_FP_EXCEPTIONS; pThreadData->m_errorCode = err; } @@ -508,7 +512,9 @@ void ThreadedCompressProc(void* lpParameter) CMP_ERROR CodecCompressTextureThreaded(const CMP_Texture* srcTexture, CMP_Texture* destTexture, const CMP_CompressOptions* options, - CMP_Feedback_Proc feedbackProc) + CMP_Feedback_Proc feedbackProc, + CMP_DWORD_PTR user1, + CMP_DWORD_PTR user2) { CodecType destType = GetCodecType(destTexture->format); if (destType == CT_Unknown) @@ -679,6 +685,8 @@ CMP_ERROR CodecCompressTextureThreaded(const CMP_Texture* srcTexture, threadData.m_pSrcBuffer->m_bSwizzle = swizzleSrcBuffer; threadData.m_pFeedbackProc = feedbackProc; + threadData.m_pUser1 = user1; + threadData.m_pUser2 = user2; ahThread[dwThreadCount++] = std::thread(ThreadedCompressProc, &threadData); } diff --git a/cmp_compressonatorlib/compressonator.cpp b/cmp_compressonatorlib/compressonator.cpp index f9f068f19..6c4be153b 100644 --- a/cmp_compressonatorlib/compressonator.cpp +++ b/cmp_compressonatorlib/compressonator.cpp @@ -273,7 +273,9 @@ static void CMP_PrepareSourceForCMP_Destination(CMP_Texture* pTexture, CMP_FORMA CMP_ERROR CMP_API CMP_ConvertTexture(CMP_Texture* pSourceTexture, CMP_Texture* pDestTexture, const CMP_CompressOptions* pOptions, - CMP_Feedback_Proc pFeedbackProc) + CMP_Feedback_Proc pFeedbackProc, + CMP_DWORD_PTR pUser1, + CMP_DWORD_PTR pUser2) { #ifdef USE_DBGTRACE DbgTrace(("-------> pSourceTexture [%x] pDestTexture [%x] pOptions [%x]", pSourceTexture, pDestTexture, pOptions)); @@ -397,17 +399,17 @@ CMP_ERROR CMP_API CMP_ConvertTexture(CMP_Texture* pSourceTexture, #endif ) { - return CodecCompressTextureThreaded(&srcTextureCopy, pDestTexture, pOptions, pFeedbackProc); + return CodecCompressTextureThreaded(&srcTextureCopy, pDestTexture, pOptions, pFeedbackProc, pUser1, pUser2); } else #endif // THREADED_COMPRESS { - return CodecCompressTexture(&srcTextureCopy, pDestTexture, pOptions, pFeedbackProc); + return CodecCompressTexture(&srcTextureCopy, pDestTexture, pOptions, pFeedbackProc, pUser1, pUser2); } } else if (!compressing && decompressing) // Decompression { - return CodecDecompressTexture(&srcTextureCopy, pDestTexture, pOptions, pFeedbackProc); + return CodecDecompressTexture(&srcTextureCopy, pDestTexture, pOptions, pFeedbackProc, pUser1, pUser2); } else // Decompressing & then compressing { @@ -458,10 +460,10 @@ CMP_ERROR CMP_API CMP_ConvertTexture(CMP_Texture* pSourceTexture, } DISABLE_FP_EXCEPTIONS; - CodecError err2 = pCodecIn->Decompress(*pSrcBuffer, *pTempBuffer, pFeedbackProc); + CodecError err2 = pCodecIn->Decompress(*pSrcBuffer, *pTempBuffer, pFeedbackProc, pUser1, pUser2); if (err2 == CE_OK) { - err2 = pCodecOut->Compress(*pTempBuffer, *pDestBuffer, pFeedbackProc); + err2 = pCodecOut->Compress(*pTempBuffer, *pDestBuffer, pFeedbackProc, pUser1, pUser2); } RESTORE_FP_EXCEPTIONS; @@ -469,7 +471,7 @@ CMP_ERROR CMP_API CMP_ConvertTexture(CMP_Texture* pSourceTexture, } } -CMP_ERROR CMP_API CMP_ConvertMipTexture(CMP_MipSet* p_MipSetIn, CMP_MipSet* p_MipSetOut, const CMP_CompressOptions* pOptions, CMP_Feedback_Proc pFeedbackProc) +CMP_ERROR CMP_API CMP_ConvertMipTexture(CMP_MipSet* p_MipSetIn, CMP_MipSet* p_MipSetOut, const CMP_CompressOptions* pOptions, CMP_Feedback_Proc pFeedbackProc, CMP_DWORD_PTR pUser1, CMP_DWORD_PTR pUser2) { assert(p_MipSetIn); assert(p_MipSetOut); @@ -577,7 +579,7 @@ CMP_ERROR CMP_API CMP_ConvertMipTexture(CMP_MipSet* p_MipSetIn, CMP_MipSet* p_Mi //======================== // Process ConvertTexture //======================== - CMP_ERROR cmp_status = CMP_ConvertTexture(&srcTexture, &destTexture, pOptions, pFeedbackProc); + CMP_ERROR cmp_status = CMP_ConvertTexture(&srcTexture, &destTexture, pOptions, pFeedbackProc, pUser1, pUser2); if (cmp_status != CMP_OK) { return cmp_status; @@ -701,7 +703,7 @@ CMP_ERROR CMP_API CMP_ConvertMipTexture(CMP_MipSet* p_MipSetIn, CMP_MipSet* p_Mi //======================== // Process ConvertTexture //======================== - CMP_ERROR cmp_status = CMP_ConvertTexture(&srcTexture, &destTexture, pOptions, pFeedbackProc); + CMP_ERROR cmp_status = CMP_ConvertTexture(&srcTexture, &destTexture, pOptions, pFeedbackProc, pUser1, pUser2); if (cmp_status != CMP_OK) { diff --git a/cmp_compressonatorlib/compressonator.h b/cmp_compressonatorlib/compressonator.h index b78cdd918..2f50ba5c2 100644 --- a/cmp_compressonatorlib/compressonator.h +++ b/cmp_compressonatorlib/compressonator.h @@ -963,7 +963,9 @@ CMP_DWORD CMP_API CMP_CalculateBufferSize(const CMP_Texture* pTexture); CMP_ERROR CMP_API CMP_ConvertTexture(CMP_Texture* pSourceTexture, CMP_Texture* pDestTexture, const CMP_CompressOptions* pOptions, - CMP_Feedback_Proc pFeedbackProc); + CMP_Feedback_Proc pFeedbackProc, + CMP_DWORD_PTR pUser1, + CMP_DWORD_PTR pUser2); #ifdef __cplusplus }; @@ -1047,15 +1049,15 @@ CMP_ERROR CMP_API CMP_MipSetAnlaysis(CMP_MipSet* src1, CMP_MipSet* src2, CMP_INT typedef bool(CMP_API* CMP_MIPFeedback_Proc)(CMP_MIPPROGRESSPARAM mipProgress); // Converts the source texture to the destination texture using MipSets with MIP MAP Levels -CMP_ERROR CMP_API CMP_ConvertMipTexture(CMP_MipSet* p_MipSetIn, CMP_MipSet* p_MipSetOut, const CMP_CompressOptions* pOptions, CMP_Feedback_Proc pFeedbackProc); +CMP_ERROR CMP_API CMP_ConvertMipTexture(CMP_MipSet* p_MipSetIn, CMP_MipSet* p_MipSetOut, const CMP_CompressOptions* pOptions, CMP_Feedback_Proc pFeedbackProc, CMP_DWORD_PTR pUser1, CMP_DWORD_PTR pUser2); //-------------------------------------------- // CMP_Framework Lib: Texture Encoder Interfaces //-------------------------------------------- CMP_ERROR CMP_API CMP_LoadTexture(const char* sourceFile, CMP_MipSet* pMipSet); CMP_ERROR CMP_API CMP_SaveTexture(const char* destFile, CMP_MipSet* pMipSet); -CMP_ERROR CMP_API CMP_ProcessTexture(CMP_MipSet* srcMipSet, CMP_MipSet* dstMipSet, KernelOptions kernelOptions, CMP_Feedback_Proc pFeedbackProc); -CMP_ERROR CMP_API CMP_CompressTexture(KernelOptions* options, CMP_MipSet srcMipSet, CMP_MipSet dstMipSet, CMP_Feedback_Proc pFeedback); +CMP_ERROR CMP_API CMP_ProcessTexture(CMP_MipSet* srcMipSet, CMP_MipSet* dstMipSet, KernelOptions kernelOptions, CMP_Feedback_Proc pFeedbackProc, CMP_DWORD_PTR pUser1, CMP_DWORD_PTR pUser2); +CMP_ERROR CMP_API CMP_CompressTexture(KernelOptions* options, CMP_MipSet srcMipSet, CMP_MipSet dstMipSet, CMP_Feedback_Proc pFeedback, CMP_DWORD_PTR pUser1, CMP_DWORD_PTR pUser2); CMP_VOID CMP_API CMP_Format2FourCC(CMP_FORMAT format, CMP_MipSet* pMipSet); CMP_FORMAT CMP_API CMP_ParseFormat(char* pFormat); CMP_INT CMP_API CMP_NumberOfProcessors(); diff --git a/cmp_framework/compute_base.cpp b/cmp_framework/compute_base.cpp index fc76238d6..015c04d01 100644 --- a/cmp_framework/compute_base.cpp +++ b/cmp_framework/compute_base.cpp @@ -385,13 +385,13 @@ CMP_ERROR CMP_API CMP_GetDeviceInfo(KernelDeviceInfo* pDeviceInfo) return CMP_OK; } -CMP_ERROR CMP_API CMP_CompressTexture(KernelOptions* options, CMP_MipSet srcMipSet, CMP_MipSet dstMipSet, CMP_Feedback_Proc pFeedback) +CMP_ERROR CMP_API CMP_CompressTexture(KernelOptions* options, CMP_MipSet srcMipSet, CMP_MipSet dstMipSet, CMP_Feedback_Proc pFeedback, CMP_DWORD_PTR pUser1, CMP_DWORD_PTR pUser2) { CMP_ERROR result; if (g_ComputeBase) { - result = g_ComputeBase->TC_Compress(options, srcMipSet, dstMipSet, pFeedback); + result = g_ComputeBase->TC_Compress(options, srcMipSet, dstMipSet, pFeedback, pUser1, pUser2); if (result != CMP_OK) return (result); } @@ -419,7 +419,7 @@ CMP_ERROR CMP_API CMP_SetComputeOptions(ComputeOptions* options) //=========================================================================================================== std::mutex cmp_mutex; -CMP_ERROR CMP_API CMP_ProcessTexture(CMP_MipSet* srcMipSet, CMP_MipSet* dstMipSet, KernelOptions kernelOptions, CMP_Feedback_Proc pFeedbackProc) +CMP_ERROR CMP_API CMP_ProcessTexture(CMP_MipSet* srcMipSet, CMP_MipSet* dstMipSet, KernelOptions kernelOptions, CMP_Feedback_Proc pFeedbackProc, CMP_DWORD_PTR pUser1, CMP_DWORD_PTR pUser2) { cmp_mutex.lock(); @@ -550,7 +550,7 @@ CMP_ERROR CMP_API CMP_ProcessTexture(CMP_MipSet* srcMipSet, CMP_MipSet* dstMipSe } // Do the compression - if (CMP_CompressTexture(&kernelOptions, *srcMipSet, *dstMipSet, pFeedbackProc) != CMP_OK) + if (CMP_CompressTexture(&kernelOptions, *srcMipSet, *dstMipSet, pFeedbackProc, pUser1, pUser2) != CMP_OK) { CMips.FreeMipSet(dstMipSet); CMP_DestroyComputeLibrary(true); diff --git a/cmp_framework/compute_base.h b/cmp_framework/compute_base.h index 3a2c42553..972ff78fe 100644 --- a/cmp_framework/compute_base.h +++ b/cmp_framework/compute_base.h @@ -47,7 +47,7 @@ class ComputeBase : public RenderWindow ComputeBase(){}; virtual ~ComputeBase(){}; - virtual CMP_ERROR Compress(KernelOptions* Options, MipSet& SrcTexture, MipSet& destTexture, CMP_Feedback_Proc pFeedback) = 0; + virtual CMP_ERROR Compress(KernelOptions* Options, MipSet& SrcTexture, MipSet& destTexture, CMP_Feedback_Proc pFeedback, CMP_DWORD_PTR pUser1, CMP_DWORD_PTR pUser2) = 0; virtual void SetComputeOptions(ComputeOptions* options) = 0; virtual float GetProcessElapsedTimeMS() = 0; virtual float GetMTxPerSec() = 0;