P4 to Git Change 1136253 by gandryey@gera-w8 on 2015/03/31 12:51:46

ECR #304775 - Mipmaps support in OCL
	- Add changes for the sampler usage with mipmaped images

Affected files ...

... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_sampler.cpp#5 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudevice.cpp#504 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudevice.hpp#141 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gslbe/src/rt/GSLDevice.cpp#113 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gslbe/src/rt/GSLDevice.h#46 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/sampler.hpp#7 edit


[ROCm/clr commit: 78967878c7]
Этот коммит содержится в:
foreman
2015-03-31 13:06:05 -04:00
родитель d68c4e65db
Коммит e9ff61bd20
+61 -21
Просмотреть файл
@@ -63,30 +63,46 @@ RUNTIME_ENTRY_RET(cl_sampler, clCreateSamplerWithProperties, (
return (cl_sampler) 0;
}
cl_bool normalized_coords = CL_TRUE;
cl_addressing_mode addressing_mode = CL_ADDRESS_CLAMP;
cl_filter_mode filter_mode = CL_FILTER_NEAREST;
cl_bool normalizedCoords = CL_TRUE;
cl_addressing_mode addressingMode = CL_ADDRESS_CLAMP;
cl_filter_mode filterMode = CL_FILTER_NEAREST;
#ifndef CL_FILTER_NONE
#define CL_FILTER_NONE 0x1142
#endif
cl_filter_mode mipFilterMode = CL_FILTER_NONE;
float minLod = 0.f;
float maxLod = CL_MAXFLOAT;
const struct SamplerProperty {
cl_sampler_properties name;
union {
cl_sampler_properties raw;
cl_bool normalized_coords;
cl_addressing_mode addressing_mode;
cl_filter_mode filter_mode;
cl_bool normalizedCoords;
cl_addressing_mode addressingMode;
cl_filter_mode filterMode;
cl_float lod;
} value;
} *p = reinterpret_cast<const SamplerProperty*>(sampler_properties);
if(p != NULL) while(p->name != 0) {
if (p != NULL) while(p->name != 0) {
switch(p->name) {
case CL_SAMPLER_NORMALIZED_COORDS:
normalized_coords = p->value.normalized_coords;
normalizedCoords = p->value.normalizedCoords;
break;
case CL_SAMPLER_ADDRESSING_MODE:
addressing_mode = p->value.addressing_mode;
addressingMode = p->value.addressingMode;
break;
case CL_SAMPLER_FILTER_MODE:
filter_mode = p->value.filter_mode;
filterMode = p->value.filterMode;
break;
case CL_SAMPLER_MIP_FILTER_MODE:
mipFilterMode = p->value.filterMode;
break;
case CL_SAMPLER_LOD_MIN:
minLod = p->value.lod;
break;
case CL_SAMPLER_LOD_MAX:
maxLod = p->value.lod;
break;
default:
*not_null(errcode_ret) = CL_INVALID_VALUE;
@@ -98,41 +114,47 @@ RUNTIME_ENTRY_RET(cl_sampler, clCreateSamplerWithProperties, (
// Check sampler validity
// Check addressing mode
switch(addressing_mode) {
switch (addressingMode) {
case CL_ADDRESS_NONE:
case CL_ADDRESS_CLAMP_TO_EDGE:
case CL_ADDRESS_CLAMP:
break;
case CL_ADDRESS_REPEAT:
if(!normalized_coords) {
if (!normalizedCoords) {
// repeat mode cannot be used with unnormalized coordinates
*not_null(errcode_ret) = CL_INVALID_VALUE;
LogWarning("invalid combination for sampler");
return (cl_sampler) 0;
}
break;
case CL_ADDRESS_MIRRORED_REPEAT:
if(!normalized_coords) {
if (!normalizedCoords) {
// repeat mode cannot be used with unnormalized coordinates
*not_null(errcode_ret) = CL_INVALID_VALUE;
LogWarning("invalid combination for sampler");
return (cl_sampler) 0;
}
break;
default:
*not_null(errcode_ret) = CL_INVALID_VALUE;
LogWarning("invalid addressing mode");
return (cl_sampler) 0;
}
// Check filter mode
switch(filter_mode) {
switch (filterMode) {
case CL_FILTER_NEAREST:
case CL_FILTER_LINEAR:
break;
default:
*not_null(errcode_ret) = CL_INVALID_VALUE;
LogWarning("invalid filter mode");
return (cl_sampler) 0;
}
switch (mipFilterMode) {
case CL_FILTER_NONE:
case CL_FILTER_NEAREST:
case CL_FILTER_LINEAR:
break;
default:
*not_null(errcode_ret) = CL_INVALID_VALUE;
LogWarning("invalid filter mode");
@@ -141,9 +163,12 @@ RUNTIME_ENTRY_RET(cl_sampler, clCreateSamplerWithProperties, (
// Create instance of Sampler
amd::Sampler* sampler = new amd::Sampler(
*as_amd(context),
normalized_coords != 0, // To get rid of VS warning C4800
addressing_mode,
filter_mode);
normalizedCoords == CL_TRUE, // To get rid of VS warning C4800
addressingMode,
filterMode,
mipFilterMode,
minLod,
maxLod);
if (!sampler) {
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
LogWarning("not enough host memory");
@@ -315,6 +340,21 @@ RUNTIME_ENTRY(cl_int, clGetSamplerInfo, (
return amd::clGetInfo(
normalized, param_value_size, param_value, param_value_size_ret);
}
case CL_SAMPLER_MIP_FILTER_MODE: {
cl_filter_mode mipFilter = as_amd(sampler)->mipFilter();
return amd::clGetInfo(
mipFilter, param_value_size, param_value, param_value_size_ret);
}
case CL_SAMPLER_LOD_MIN: {
cl_float minLod = as_amd(sampler)->minLod();
return amd::clGetInfo(
minLod, param_value_size, param_value, param_value_size_ret);
}
case CL_SAMPLER_LOD_MAX: {
cl_float maxLod = as_amd(sampler)->maxLod();
return amd::clGetInfo(
maxLod, param_value_size, param_value, param_value_size_ret);
}
default:
break;
}