mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 20:18:12 +02:00
amd/gmlib: add tm_generate_formatted_3DLut
Adds a utility to format a 3D LUT into the required memory layout and write it into a given buffer. Signed-off-by: Peyton Lee <peytolee@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41190>
This commit is contained in:
parent
ca92f8697e
commit
ab878cc1ea
2 changed files with 46 additions and 4 deletions
|
|
@ -50,12 +50,12 @@ void tm_destroy(void** pp_tmGenerator)
|
|||
*pp_tmGenerator = NULL;
|
||||
}
|
||||
|
||||
int tm_generate3DLut(struct tonemap_param* pInparam, void* pformattedLutData)
|
||||
int tm_generate3DLut(struct tonemap_param* pInparam, void* pLutData)
|
||||
{
|
||||
enum TMGReturnCode result;
|
||||
struct ToneMappingParameters tmParams;
|
||||
|
||||
tmParams.lutData = (uint16_t *)pformattedLutData;
|
||||
tmParams.lutData = (uint16_t *)pLutData;
|
||||
|
||||
ToneMapGenerator_SetInternalAllocators(
|
||||
(struct ToneMapGenerator*)pInparam->tm_handle,
|
||||
|
|
@ -76,3 +76,39 @@ int tm_generate3DLut(struct tonemap_param* pInparam, void* pformattedLutData)
|
|||
|
||||
return (int)result;
|
||||
}
|
||||
|
||||
int tm_generate_formatted_3DLut(
|
||||
uint16_t* pCpuLutData,
|
||||
int cpuLutDim,
|
||||
int gpuLutContainerDim,
|
||||
const float bitDepthCpu,
|
||||
const uint32_t bitDepthGpu,
|
||||
void* pGpuLutData)
|
||||
{
|
||||
int result = 1;
|
||||
/* HardCode: use 256bits alignment */
|
||||
int AlignedLutContainerDim = ((gpuLutContainerDim + 32) >> 5) * 32;
|
||||
|
||||
if ((NULL != pCpuLutData) && (NULL != pGpuLutData)) {
|
||||
uint16_t* pGpuData = (uint16_t *)pGpuLutData;
|
||||
int cpuSurfIndex = 0;
|
||||
int gpuSurfIndex = 0;
|
||||
int widthSize = AlignedLutContainerDim * 4;
|
||||
int sliceSize = widthSize * gpuLutContainerDim;
|
||||
int i, j, k;
|
||||
|
||||
for (i = 0; i < cpuLutDim; i++) {
|
||||
for (j = 0; j < cpuLutDim; j++) {
|
||||
for (k = 0; k < cpuLutDim; k++) {
|
||||
cpuSurfIndex = i * cpuLutDim * cpuLutDim * 3 + j * cpuLutDim * 3 + k * 3;
|
||||
gpuSurfIndex = i * sliceSize + j * widthSize + k * 4;
|
||||
*(pGpuData + gpuSurfIndex + 0) = (uint16_t)(((float)(pCpuLutData[cpuSurfIndex + 0]) / (float)bitDepthCpu) * bitDepthGpu);
|
||||
*(pGpuData + gpuSurfIndex + 1) = (uint16_t)(((float)(pCpuLutData[cpuSurfIndex + 1]) / (float)bitDepthCpu) * bitDepthGpu);
|
||||
*(pGpuData + gpuSurfIndex + 2) = (uint16_t)(((float)(pCpuLutData[cpuSurfIndex + 2]) / (float)bitDepthCpu) * bitDepthGpu);
|
||||
}
|
||||
}
|
||||
}
|
||||
result = 0;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,8 +26,14 @@ struct tonemap_param
|
|||
|
||||
void* tm_create(void);
|
||||
void tm_destroy(void** pp_tmGenerator);
|
||||
int tm_generate3DLut(struct tonemap_param* pInparam, void* pformattedLutData);
|
||||
int tm_generate3DLut(struct tonemap_param* pInparam, void* pLutData);
|
||||
int tm_generate_formatted_3DLut(uint16_t* pCpuLutData,
|
||||
int cpuLutDim,
|
||||
int gpuLutContainerDim,
|
||||
const float bitDepthCpu,
|
||||
const uint32_t bitDepthGpu,
|
||||
void* pGpuLutData);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue