2020-07-31 11:31:32 +08:00
|
|
|
//===============================================================================
|
|
|
|
// Copyright (c) 2007-2016 Advanced Micro Devices, Inc. All rights reserved.
|
|
|
|
// Copyright (c) 2004-2006 ATI Technologies Inc.
|
|
|
|
//===============================================================================
|
|
|
|
//
|
|
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
// of this software and associated documentation files(the "Software"), to deal
|
|
|
|
// in the Software without restriction, including without limitation the rights
|
|
|
|
// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
|
|
|
|
// copies of the Software, and to permit persons to whom the Software is
|
|
|
|
// furnished to do so, subject to the following conditions :
|
2021-09-08 10:54:22 +08:00
|
|
|
//
|
2020-07-31 11:31:32 +08:00
|
|
|
// The above copyright notice and this permission notice shall be included in
|
|
|
|
// all copies or substantial portions of the Software.
|
2021-09-08 10:54:22 +08:00
|
|
|
//
|
2020-07-31 11:31:32 +08:00
|
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
|
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
// THE SOFTWARE.
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// File Name: CodecBuffer_Block.cpp
|
|
|
|
// Description: implementation of the CCodecBuffer_Block class
|
|
|
|
//
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2021-09-08 10:54:22 +08:00
|
|
|
#include "common.h"
|
|
|
|
#include "codecbuffer_block.h"
|
2020-07-31 11:31:32 +08:00
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Construction/Destruction
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2021-09-08 10:54:22 +08:00
|
|
|
CCodecBuffer_Block::CCodecBuffer_Block(CodecBufferType nCodecBufferType,
|
2020-07-31 11:31:32 +08:00
|
|
|
CMP_BYTE nBlockWidth, CMP_BYTE nBlockHeight, CMP_BYTE nBlockDepth,
|
|
|
|
CMP_DWORD dwWidth, CMP_DWORD dwHeight, CMP_DWORD dwPitch, CMP_BYTE* pData,CMP_DWORD dwDataSize)
|
2021-09-08 10:54:22 +08:00
|
|
|
: CCodecBuffer(nBlockWidth, nBlockHeight, nBlockDepth, dwWidth, dwHeight, dwPitch, pData,dwDataSize), m_nCodecBufferType(nCodecBufferType) {
|
|
|
|
// ToDo: All of these cases all need to be updated from default values
|
2020-07-31 11:31:32 +08:00
|
|
|
// to those passed down! for now we has asjusted the case
|
|
|
|
// of CBT_4x4Block_8BPP which is common for DXTn and BCn (defaults should be 4x4 however since the introduction of ASTC
|
|
|
|
// and GT Codec the sizes are now variable from 4x4 to 12x12 (for ASTC) and 4x4 to BlockW x BlockH for GT
|
|
|
|
// Should also investigate changing m_dwBlockBPP
|
|
|
|
|
2021-09-08 10:54:22 +08:00
|
|
|
switch(nCodecBufferType) {
|
|
|
|
case CBT_4x4Block_2BPP:
|
|
|
|
m_dwBlockWidth = 4;
|
|
|
|
m_dwBlockHeight = 4;
|
|
|
|
m_dwBlockBPP = 2;
|
|
|
|
break;
|
|
|
|
case CBT_4x4Block_4BPP:
|
|
|
|
m_dwBlockWidth = 4;
|
|
|
|
m_dwBlockHeight = 4;
|
|
|
|
m_dwBlockBPP = 4;
|
|
|
|
break;
|
|
|
|
case CBT_4x4Block_8BPP:
|
|
|
|
m_dwBlockWidth = 4;
|
|
|
|
m_dwBlockHeight = 4;
|
|
|
|
m_dwBlockBPP = 8;
|
|
|
|
break;
|
|
|
|
case CBT_4x4Block_16BPP:
|
|
|
|
m_dwBlockWidth = 4;
|
|
|
|
m_dwBlockHeight = 4;
|
|
|
|
m_dwBlockBPP = 16;
|
|
|
|
break;
|
|
|
|
case CBT_4x4Block_32BPP:
|
|
|
|
m_dwBlockWidth = 4;
|
|
|
|
m_dwBlockHeight = 4;
|
|
|
|
m_dwBlockBPP = 32;
|
|
|
|
break;
|
|
|
|
case CBT_8x8Block_2BPP:
|
|
|
|
m_dwBlockWidth = 8;
|
|
|
|
m_dwBlockHeight = 8;
|
|
|
|
m_dwBlockBPP = 2;
|
|
|
|
break;
|
|
|
|
case CBT_8x8Block_4BPP:
|
|
|
|
m_dwBlockWidth = 8;
|
|
|
|
m_dwBlockHeight = 8;
|
|
|
|
m_dwBlockBPP = 4;
|
|
|
|
break;
|
|
|
|
case CBT_8x8Block_8BPP:
|
|
|
|
m_dwBlockWidth = 8;
|
|
|
|
m_dwBlockHeight = 8;
|
|
|
|
m_dwBlockBPP = 8;
|
|
|
|
break;
|
|
|
|
case CBT_8x8Block_16BPP:
|
|
|
|
m_dwBlockWidth = 8;
|
|
|
|
m_dwBlockHeight = 8;
|
|
|
|
m_dwBlockBPP = 16;
|
|
|
|
break;
|
|
|
|
case CBT_8x8Block_32BPP:
|
|
|
|
m_dwBlockWidth = 8;
|
|
|
|
m_dwBlockHeight = 8;
|
|
|
|
m_dwBlockBPP = 32;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
m_dwBlockWidth = nBlockWidth;
|
|
|
|
m_dwBlockHeight = nBlockHeight;
|
|
|
|
m_dwBlockBPP = 8;
|
|
|
|
break;
|
2020-07-31 11:31:32 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
CMP_DWORD dwBlocksX = ((GetWidth() + m_dwBlockWidth - 1) / m_dwBlockWidth);
|
|
|
|
CMP_DWORD dwBlocksY = ((GetHeight() + m_dwBlockHeight - 1) / m_dwBlockHeight);
|
|
|
|
CMP_DWORD dwBlocks = dwBlocksX * dwBlocksY;
|
|
|
|
m_dwBlockSize = m_dwBlockWidth * m_dwBlockHeight * m_dwBlockBPP / 8;
|
|
|
|
m_dwPitch = dwBlocksX * m_dwBlockSize;
|
|
|
|
|
2021-09-08 10:54:22 +08:00
|
|
|
if(m_pData == NULL) {
|
2020-07-31 11:31:32 +08:00
|
|
|
CMP_DWORD dwSize = dwBlocks * m_dwBlockSize;
|
|
|
|
m_pData = (CMP_BYTE*) malloc(dwSize);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-08 10:54:22 +08:00
|
|
|
CCodecBuffer_Block::~CCodecBuffer_Block() {
|
2020-07-31 11:31:32 +08:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-09-08 10:54:22 +08:00
|
|
|
bool CCodecBuffer_Block::ReadBlock(CMP_DWORD x, CMP_DWORD y, CMP_DWORD* pBlock, CMP_DWORD dwBlockSize) {
|
2020-07-31 11:31:32 +08:00
|
|
|
assert(pBlock);
|
|
|
|
assert(x < GetWidth());
|
|
|
|
assert(y < GetHeight());
|
|
|
|
|
|
|
|
if(!pBlock || x >= GetWidth() || y >= GetHeight())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
int offset = ((y / m_dwBlockHeight) * m_dwPitch) + ((x / m_dwBlockWidth) * dwBlockSize * sizeof(CMP_DWORD));
|
|
|
|
|
|
|
|
memcpy(pBlock, GetData() + offset, dwBlockSize * sizeof(CMP_DWORD));
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2021-09-08 10:54:22 +08:00
|
|
|
bool CCodecBuffer_Block::WriteBlock(CMP_DWORD x, CMP_DWORD y, CMP_DWORD* pBlock, CMP_DWORD dwBlockSize) {
|
2020-07-31 11:31:32 +08:00
|
|
|
assert(pBlock);
|
|
|
|
assert(x < GetWidth());
|
|
|
|
assert(y < GetHeight());
|
|
|
|
|
|
|
|
if(!pBlock || x >= GetWidth() || y >= GetHeight())
|
|
|
|
return false;
|
|
|
|
int offset = ((y / m_dwBlockHeight) * m_dwPitch) + ((x / m_dwBlockWidth) * dwBlockSize * sizeof(CMP_DWORD));
|
|
|
|
memcpy(GetData() + offset, pBlock, dwBlockSize * sizeof(CMP_DWORD));
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|