diff options
author | gman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-17 06:26:52 +0000 |
---|---|---|
committer | gman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-17 06:26:52 +0000 |
commit | 1dc3ba84c3da4edfeaf22cedf65750533a20de00 (patch) | |
tree | 936325e6f2dd07667fc4161ac524f1ab076aa5bf /o3d/core/cross | |
parent | 3d476cf047d6a463d5706f70bfdf5e3787f863ee (diff) | |
download | chromium_src-1dc3ba84c3da4edfeaf22cedf65750533a20de00.zip chromium_src-1dc3ba84c3da4edfeaf22cedf65750533a20de00.tar.gz chromium_src-1dc3ba84c3da4edfeaf22cedf65750533a20de00.tar.bz2 |
adding svn:ignore properties to ignore .o3dtgz
files as well as scons-out etc...
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18599 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'o3d/core/cross')
-rw-r--r-- | o3d/core/cross/effect.cc | 7 | ||||
-rw-r--r-- | o3d/core/cross/effect_test.cc | 73 | ||||
-rw-r--r-- | o3d/core/cross/gl/effect_gl.cc | 2 | ||||
-rw-r--r-- | o3d/core/cross/gl/param_cache_gl.cc | 272 |
4 files changed, 322 insertions, 32 deletions
diff --git a/o3d/core/cross/effect.cc b/o3d/core/cross/effect.cc index 9c271fb..64b109d 100644 --- a/o3d/core/cross/effect.cc +++ b/o3d/core/cross/effect.cc @@ -125,12 +125,11 @@ void Effect::CreateSpecifiedParameters(ParamObject* param_object, bool sas) { param = param_object->CreateParamByClass( param_info.name(), param_info.sas_class_type() ? param_info.sas_class_type() : - param_info.class_type()); + param_info.class_type()); } else { // Array type - param = param_object->CreateParamByClass( - param_info.name(), - ParamParamArray::GetApparentClass()); + param = + param_object->CreateParam<ParamParamArray>(param_info.name()); } if (!param) { errors += String(errors.empty() ? "" : "\n") + diff --git a/o3d/core/cross/effect_test.cc b/o3d/core/cross/effect_test.cc index af028e6..b26f632 100644 --- a/o3d/core/cross/effect_test.cc +++ b/o3d/core/cross/effect_test.cc @@ -34,6 +34,7 @@ #include "core/cross/effect.h" #include "core/cross/primitive.h" #include "core/cross/standard_param.h" +#include "core/cross/param_array.h" #include "core/cross/stream.h" #include "tests/common/win/testing_common.h" @@ -161,7 +162,7 @@ uint32 kIndexBlock[4] = { 0, 1, 2, 3 }; -bool IsExpectedParam(const EffectParameterInfo& info) { +bool IsExpectedParamInfo(const EffectParameterInfo& info) { for (unsigned ii = 0; ii < arraysize(expected_params); ++ii) { const ParamInfo& expected_info = expected_params[ii]; if (info.name().compare(expected_info.name) == 0) { @@ -333,7 +334,75 @@ TEST_F(EffectTest, GetEffectParameters) { EXPECT_EQ(arraysize(expected_params), info.size()); for (EffectParameterInfoArray::size_type ii = 0; ii < info.size(); ++ii) { - EXPECT_TRUE(IsExpectedParam(info[ii])); + EXPECT_TRUE(IsExpectedParamInfo(info[ii])); + } + + // Clean up. + object_manager()->DestroyPack(pack); +} + +TEST_F(EffectTest, CreateUniformParameters) { + Pack* pack = object_manager()->CreatePack(); + ASSERT_TRUE(pack != NULL); + + // load an effect + Effect *fx = pack->Create<Effect>(); + ASSERT_TRUE(fx != NULL); + EXPECT_TRUE(fx->LoadFromFXString(String(kLambertEffect))); + + ParamObject* param_object = pack->Create<ParamObject>(); + ASSERT_TRUE(param_object != NULL); + + // Check that we get the correct params + fx->CreateUniformParameters(param_object); + + for (unsigned ii = 0; ii < arraysize(expected_params); ++ii) { + const ParamInfo& expected_info = expected_params[ii]; + Param* param = param_object->GetUntypedParam(expected_info.name); + if (expected_info.sas_type) { + ASSERT_TRUE(param == NULL); + } else { + ASSERT_TRUE(param != NULL); + if (expected_info.num_elements > 0) { + ASSERT_TRUE(param->IsA(ParamParamArray::GetApparentClass())); + } else { + EXPECT_TRUE(param->IsA(expected_info.type)); + } + } + } + + // Clean up. + object_manager()->DestroyPack(pack); +} + +TEST_F(EffectTest, CreateSASParameters) { + Pack* pack = object_manager()->CreatePack(); + ASSERT_TRUE(pack != NULL); + + // load an effect + Effect *fx = pack->Create<Effect>(); + ASSERT_TRUE(fx != NULL); + EXPECT_TRUE(fx->LoadFromFXString(String(kLambertEffect))); + + ParamObject* param_object = pack->Create<ParamObject>(); + ASSERT_TRUE(param_object != NULL); + + // Check that we get the correct params + fx->CreateSASParameters(param_object); + + for (unsigned ii = 0; ii < arraysize(expected_params); ++ii) { + const ParamInfo& expected_info = expected_params[ii]; + Param* param = param_object->GetUntypedParam(expected_info.name); + if (expected_info.sas_type) { + ASSERT_TRUE(param != NULL); + if (expected_info.num_elements > 0) { + ASSERT_TRUE(param->IsA(ParamParamArray::GetApparentClass())); + } else { + EXPECT_TRUE(param->IsA(expected_info.sas_type)); + } + } else { + ASSERT_TRUE(param == NULL); + } } // Clean up. diff --git a/o3d/core/cross/gl/effect_gl.cc b/o3d/core/cross/gl/effect_gl.cc index 9fe940e..d8c24d4 100644 --- a/o3d/core/cross/gl/effect_gl.cc +++ b/o3d/core/cross/gl/effect_gl.cc @@ -75,6 +75,7 @@ static const ObjectBase::Class* CgTypeToParamType(CGtype cg_type) { case CG_FLOAT2 : return ParamFloat2::GetApparentClass(); case CG_FLOAT3 : return ParamFloat3::GetApparentClass(); case CG_FLOAT4 : return ParamFloat4::GetApparentClass(); + case CG_INT : return ParamInteger::GetApparentClass(); case CG_INT1 : return ParamInteger::GetApparentClass(); case CG_FLOAT4x4 : return ParamMatrix4::GetApparentClass(); case CG_BOOL : @@ -82,6 +83,7 @@ static const ObjectBase::Class* CgTypeToParamType(CGtype cg_type) { case CG_SAMPLER : case CG_SAMPLER1D : case CG_SAMPLER2D : + case CG_SAMPLER3D : case CG_SAMPLERCUBE : return ParamSampler::GetApparentClass(); default : { DLOG(ERROR) << "Cannot convert CGtype " diff --git a/o3d/core/cross/gl/param_cache_gl.cc b/o3d/core/cross/gl/param_cache_gl.cc index b91245e..8b46da2 100644 --- a/o3d/core/cross/gl/param_cache_gl.cc +++ b/o3d/core/cross/gl/param_cache_gl.cc @@ -179,8 +179,7 @@ class EffectParamHandlerForSamplersGL : public EffectParamHandlerGL { SamplerGL* sampler_gl = down_cast<SamplerGL*>(param_->value()); if (!sampler_gl) { // Use the error sampler. - sampler_gl = down_cast<SamplerGL*>( - renderer->error_sampler()); + sampler_gl = down_cast<SamplerGL*>(renderer->error_sampler()); // If no error texture is set then generate an error. if (!renderer->error_texture()) { O3D_ERROR(param_->service_locator()) @@ -191,41 +190,220 @@ class EffectParamHandlerForSamplersGL : public EffectParamHandlerGL { } virtual void ResetEffectParam(RendererGL* renderer, CGparameter cg_param) { SamplerGL* sampler_gl = down_cast<SamplerGL*>(param_->value()); - if (sampler_gl) { - sampler_gl->ResetTexture(cg_param); + if (!sampler_gl) { + sampler_gl = down_cast<SamplerGL*>(renderer->error_sampler()); } + sampler_gl->ResetTexture(cg_param); } private: ParamSampler* param_; }; -class EffectParamFloatArrayHandlerGL : public EffectParamHandlerGL { +template <typename T> +class EffectParamArrayHandlerGL : public EffectParamHandlerGL { public: - explicit EffectParamFloatArrayHandlerGL(ParamParamArray* param) + explicit EffectParamArrayHandlerGL(ParamParamArray* param) : param_(param) { } - virtual void SetEffectParam(RendererGL* renderer, CGparameter cg_param); + virtual void SetEffectParam(RendererGL* renderer, CGparameter cg_param) { + ParamArray* param = param_->value(); + if (param) { + int size = cgGetArraySize(cg_param, 0); + if (size != static_cast<int>(param->size())) { + O3D_ERROR(param->service_locator()) + << "number of params in ParamArray does not match number of params " + << "needed by shader array"; + } else { + for (int i = 0; i < size; ++i) { + Param* untyped_element = param->GetUntypedParam(i); + // TODO: Make this check happen when building the param cache. + // To do that would require that ParamParamArray mark it's owner + // as changed if a Param in it's ParamArray changes. + if (untyped_element->IsA(T::GetApparentClass())) { + CGparameter cg_element = cgGetArrayParameter(cg_param, i); + SetElement(cg_element, down_cast<T*>(untyped_element)); + } else { + O3D_ERROR(param->service_locator()) + << "Param in ParamArray at index " << i << " is not a " + << T::GetApparentClassName(); + } + } + } + } + } + void SetElement(CGparameter cg_element, T* param); + private: ParamParamArray* param_; }; -void EffectParamFloatArrayHandlerGL::SetEffectParam( - RendererGL* renderer, - CGparameter cg_param) { - ParamArray* param = param_->value(); - if (param) { - int cg_size = cgGetArraySize(cg_param, 0); - int size = std::min(static_cast<int>(param->size()), cg_size); - for (int i = 0; i < size; ++i) { - ParamFloat* element = param->GetParam<ParamFloat>(i); - CGparameter cg_element = cgGetArrayParameter(cg_param, i); - if (element) { - cgSetParameter1f(cg_element, element->value()); +template <bool column_major> +class EffectParamArrayMatrix4HandlerGL : public EffectParamHandlerGL { + public: + explicit EffectParamArrayMatrix4HandlerGL(ParamParamArray* param) + : param_(param) { + } + virtual void SetEffectParam(RendererGL* renderer, CGparameter cg_param) { + ParamArray* param = param_->value(); + if (param) { + int size = cgGetArraySize(cg_param, 0); + if (size != static_cast<int>(param->size())) { + O3D_ERROR(param->service_locator()) + << "number of params in ParamArray does not match number of params " + << "needed by shader array"; } else { - cgSetParameter1f(cg_element, 0.0f); + for (int i = 0; i < size; ++i) { + Param* untyped_element = param->GetUntypedParam(i); + // TODO: Make this check happen when building the param cache. + // To do that would require that ParamParamArray mark it's owner + // as changed if a Param in it's ParamArray changes. + if (untyped_element->IsA(ParamMatrix4::GetApparentClass())) { + CGparameter cg_element = cgGetArrayParameter(cg_param, i); + SetElement(cg_element, down_cast<ParamMatrix4*>(untyped_element)); + } else { + O3D_ERROR(param->service_locator()) + << "Param in ParamArray at index " << i + << " is not a ParamMatrix4"; + } + } + } + } + } + void SetElement(CGparameter cg_element, ParamMatrix4* param); + + private: + ParamParamArray* param_; +}; + +class EffectParamArraySamplerHandlerGL : public EffectParamHandlerGL { + public: + explicit EffectParamArraySamplerHandlerGL(ParamParamArray* param) + : param_(param) { + } + virtual void SetEffectParam(RendererGL* renderer, CGparameter cg_param) { + ParamArray* param = param_->value(); + if (param) { + int size = cgGetArraySize(cg_param, 0); + if (size != static_cast<int>(param->size())) { + O3D_ERROR(param->service_locator()) + << "number of params in ParamArray does not match number of params " + << "needed by shader array"; + } else { + for (int i = 0; i < size; ++i) { + Param* untyped_element = param->GetUntypedParam(i); + // TODO: Make this check happen when building the param cache. + // To do that would require that ParamParamArray mark it's owner + // as changed if a Param in it's ParamArray changes. + if (untyped_element->IsA(ParamSampler::GetApparentClass())) { + CGparameter cg_element = cgGetArrayParameter(cg_param, i); + ParamSampler* element = down_cast<ParamSampler*>(untyped_element); + SamplerGL* sampler_gl = down_cast<SamplerGL*>(element->value()); + if (!sampler_gl) { + // Use the error sampler. + sampler_gl = down_cast<SamplerGL*>(renderer->error_sampler()); + // If no error texture is set then generate an error. + if (!renderer->error_texture()) { + O3D_ERROR(param_->service_locator()) + << "Missing Sampler for ParamSampler '" << param_->name() + << "' index " << i; + } + } + sampler_gl->SetTextureAndStates(cg_element); + } else { + O3D_ERROR(param->service_locator()) + << "Param in ParamArray at index " << i + << " is not a ParamSampler"; + } + } + } + } + } + virtual void ResetEffectParam(RendererGL* renderer, CGparameter cg_param) { + ParamArray* param = param_->value(); + if (param) { + int size = cgGetArraySize(cg_param, 0); + if (size == static_cast<int>(param->size())) { + for (int i = 0; i < size; ++i) { + Param* untyped_element = param->GetUntypedParam(i); + if (untyped_element->IsA(ParamSampler::GetApparentClass())) { + CGparameter cg_element = cgGetArrayParameter(cg_param, i); + ParamSampler* element = down_cast<ParamSampler*>(untyped_element); + SamplerGL* sampler_gl = down_cast<SamplerGL*>(element->value()); + if (!sampler_gl) { + sampler_gl = down_cast<SamplerGL*>(renderer->error_sampler()); + } + sampler_gl->ResetTexture(cg_param); + } + } } } } + + private: + ParamParamArray* param_; +}; + +template<> +void EffectParamArrayHandlerGL<ParamFloat>::SetElement( + CGparameter cg_element, + ParamFloat* param) { + cgSetParameter1f(cg_element, param->value()); +} + +template<> +void EffectParamArrayHandlerGL<ParamFloat2>::SetElement( + CGparameter cg_element, + ParamFloat2* param) { + Float2 f = param->value(); + cgSetParameter2fv(cg_element, f.GetFloatArray()); +} + +template<> +void EffectParamArrayHandlerGL<ParamFloat3>::SetElement( + CGparameter cg_element, + ParamFloat3* param) { + Float3 f = param->value(); + cgSetParameter3fv(cg_element, f.GetFloatArray()); +} + +template<> +void EffectParamArrayHandlerGL<ParamFloat4>::SetElement( + CGparameter cg_element, + ParamFloat4* param) { + Float4 f = param->value(); + cgSetParameter4fv(cg_element, f.GetFloatArray()); +} + +template<> +void EffectParamArrayMatrix4HandlerGL<false>::SetElement( + CGparameter cg_element, + ParamMatrix4* param) { + // set the data as floats in row major order. + Matrix4 mat = param->value(); + cgSetMatrixParameterfr(cg_element, &mat[0][0]); +} + +template<> +void EffectParamArrayMatrix4HandlerGL<true>::SetElement( + CGparameter cg_element, + ParamMatrix4* param) { + // set the data as floats in column major order. + Matrix4 mat = param->value(); + cgSetMatrixParameterfc(cg_element, &mat[0][0]); +} + +template<> +void EffectParamArrayHandlerGL<ParamInteger>::SetElement( + CGparameter cg_element, + ParamInteger* param) { + cgSetParameter1i(cg_element, param->value()); +} + +template<> +void EffectParamArrayHandlerGL<ParamBoolean>::SetElement( + CGparameter cg_element, + ParamBoolean* param) { + cgSetParameter1i(cg_element, param->value()); } static EffectParamHandlerGL::Ref GetHandlerFromParamAndCgType( @@ -234,10 +412,52 @@ static EffectParamHandlerGL::Ref GetHandlerFromParamAndCgType( CGtype cg_type) { EffectParamHandlerGL::Ref handler; if (param->IsA(ParamParamArray::GetApparentClass())) { - if (cg_type == CG_FLOAT) { - handler = EffectParamHandlerGL::Ref( - new EffectParamFloatArrayHandlerGL( - down_cast<ParamParamArray*>(param))); + ParamParamArray* param_param_array = down_cast<ParamParamArray*>(param); + switch (cg_type) { + case CG_FLOAT: + case CG_FLOAT1: + handler = EffectParamHandlerGL::Ref( + new EffectParamArrayHandlerGL<ParamFloat>(param_param_array)); + break; + case CG_FLOAT2: + handler = EffectParamHandlerGL::Ref( + new EffectParamArrayHandlerGL<ParamFloat2>(param_param_array)); + break; + case CG_FLOAT3: + handler = EffectParamHandlerGL::Ref( + new EffectParamArrayHandlerGL<ParamFloat3>(param_param_array)); + break; + case CG_FLOAT4: + handler = EffectParamHandlerGL::Ref( + new EffectParamArrayHandlerGL<ParamFloat4>(param_param_array)); + break; + case CG_FLOAT4x4: + if (effect_gl->matrix_load_order() == Effect::COLUMN_MAJOR) { + handler = EffectParamHandlerGL::Ref( + new EffectParamArrayMatrix4HandlerGL<true>(param_param_array)); + } else { + handler = EffectParamHandlerGL::Ref( + new EffectParamArrayMatrix4HandlerGL<false>(param_param_array)); + } + break; + case CG_INT: + case CG_INT1: + handler = EffectParamHandlerGL::Ref( + new EffectParamArrayHandlerGL<ParamInteger>(param_param_array)); + break; + case CG_BOOL: + case CG_BOOL1: + handler = EffectParamHandlerGL::Ref( + new EffectParamArrayHandlerGL<ParamBoolean>(param_param_array)); + break; + case CG_SAMPLER: + case CG_SAMPLER1D: + case CG_SAMPLER2D: + case CG_SAMPLER3D: + case CG_SAMPLERCUBE: + handler = EffectParamHandlerGL::Ref( + new EffectParamArraySamplerHandlerGL(param_param_array)); + break; } } else if (param->IsA(ParamMatrix4::GetApparentClass())) { if (cg_type == CG_FLOAT4x4) { @@ -279,13 +499,13 @@ static EffectParamHandlerGL::Ref GetHandlerFromParamAndCgType( down_cast<ParamFloat4*>(param))); } } else if (param->IsA(ParamInteger::GetApparentClass())) { - if (cg_type == CG_INT) { + if (cg_type == CG_INT || cg_type == CG_INT1) { handler = EffectParamHandlerGL::Ref( new TypedEffectParamHandlerGL<ParamInteger>( down_cast<ParamInteger*>(param))); } } else if (param->IsA(ParamBoolean::GetApparentClass())) { - if (cg_type == CG_BOOL) { + if (cg_type == CG_BOOL || cg_type == CG_BOOL1) { handler = EffectParamHandlerGL::Ref( new TypedEffectParamHandlerGL<ParamBoolean>( down_cast<ParamBoolean*>(param))); |