| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2009, Google Inc. | 2 * Copyright 2009, Google Inc. |
| 3 * All rights reserved. | 3 * All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 public: | 63 public: |
| 64 TypedParamHandlerCB(T* param, ResourceID id) | 64 TypedParamHandlerCB(T* param, ResourceID id) |
| 65 : param_(param), | 65 : param_(param), |
| 66 id_(id) { | 66 id_(id) { |
| 67 } | 67 } |
| 68 | 68 |
| 69 // Sends the param value to the service. | 69 // Sends the param value to the service. |
| 70 // This template definition only works for value types (floatn, matrix, int, | 70 // This template definition only works for value types (floatn, matrix, int, |
| 71 // ..., but not textures or samplers). | 71 // ..., but not textures or samplers). |
| 72 virtual void SetValue(CommandBufferHelper *helper) { | 72 virtual void SetValue(CommandBufferHelper *helper) { |
| 73 static const unsigned int kEntryCount = | |
| 74 (sizeof(typename T::DataType) + 3) / 4; | |
| 75 CommandBufferEntry args[2 + kEntryCount]; | |
| 76 typename T::DataType value = param_->value(); | 73 typename T::DataType value = param_->value(); |
| 77 args[0].value_uint32 = id_; | 74 helper->SetParamDataImmediate(id_, sizeof(value), &value); |
| 78 args[1].value_uint32 = sizeof(value); | |
| 79 memcpy(args + 2, &value, sizeof(value)); | |
| 80 helper->AddCommand(command_buffer::SET_PARAM_DATA_IMMEDIATE, | |
| 81 2 + kEntryCount, args); | |
| 82 } | 75 } |
| 83 private: | 76 private: |
| 84 T* param_; | 77 T* param_; |
| 85 ResourceID id_; | 78 ResourceID id_; |
| 86 }; | 79 }; |
| 87 | 80 |
| 88 // Matrices are expected in row major order in the command buffer, so | 81 // Matrices are expected in row major order in the command buffer, so |
| 89 // TypedParamHandlerCB<ParamMatrix4> works for row major, and we make a new | 82 // TypedParamHandlerCB<ParamMatrix4> works for row major, and we make a new |
| 90 // class for column major. | 83 // class for column major. |
| 91 typedef TypedParamHandlerCB<ParamMatrix4> MatrixParamHandlerRowsCB; | 84 typedef TypedParamHandlerCB<ParamMatrix4> MatrixParamHandlerRowsCB; |
| 92 | 85 |
| 93 class MatrixParamHandlerColumnsCB : public ParamHandlerCB { | 86 class MatrixParamHandlerColumnsCB : public ParamHandlerCB { |
| 94 public: | 87 public: |
| 95 MatrixParamHandlerColumnsCB(ParamMatrix4* param, ResourceID id) | 88 MatrixParamHandlerColumnsCB(ParamMatrix4* param, ResourceID id) |
| 96 : param_(param), | 89 : param_(param), |
| 97 id_(id) { | 90 id_(id) { |
| 98 } | 91 } |
| 99 | 92 |
| 100 // Sends the param value to the service. | 93 // Sends the param value to the service. |
| 101 virtual void SetValue(CommandBufferHelper *helper) { | 94 virtual void SetValue(CommandBufferHelper *helper) { |
| 102 CommandBufferEntry args[18]; | |
| 103 Matrix4 value = transpose(param_->value()); | 95 Matrix4 value = transpose(param_->value()); |
| 104 args[0].value_uint32 = id_; | 96 helper->SetParamDataImmediate(id_, sizeof(value), &value); |
| 105 args[1].value_uint32 = sizeof(value); | |
| 106 memcpy(args + 2, &value, sizeof(value)); | |
| 107 helper->AddCommand(command_buffer::SET_PARAM_DATA_IMMEDIATE, 18, args); | |
| 108 } | 97 } |
| 109 private: | 98 private: |
| 110 ParamMatrix4* param_; | 99 ParamMatrix4* param_; |
| 111 ResourceID id_; | 100 ResourceID id_; |
| 112 }; | 101 }; |
| 113 | 102 |
| 114 class SamplerParamHandlerCB : public ParamHandlerCB { | 103 class SamplerParamHandlerCB : public ParamHandlerCB { |
| 115 public: | 104 public: |
| 116 SamplerParamHandlerCB(ParamSampler* param, ResourceID id) | 105 SamplerParamHandlerCB(ParamSampler* param, ResourceID id) |
| 117 : param_(param), | 106 : param_(param), |
| 118 id_(id) { | 107 id_(id) { |
| 119 } | 108 } |
| 120 | 109 |
| 121 // Sends the param value to the service. | 110 // Sends the param value to the service. |
| 122 virtual void SetValue(CommandBufferHelper *helper) { | 111 virtual void SetValue(CommandBufferHelper *helper) { |
| 123 SamplerCB *sampler = down_cast<SamplerCB *>(param_->value()); | 112 SamplerCB *sampler = down_cast<SamplerCB *>(param_->value()); |
| 124 CommandBufferEntry args[3]; | 113 uint32 value; |
| 125 args[0].value_uint32 = id_; | |
| 126 args[1].value_uint32 = sizeof(ResourceID); | |
| 127 if (!sampler) { | 114 if (!sampler) { |
| 128 // TODO: use error sampler | 115 // TODO: use error sampler |
| 129 args[2].value_uint32 = command_buffer::kInvalidResource; | 116 value = command_buffer::kInvalidResource; |
| 130 } else { | 117 } else { |
| 131 sampler->SetTextureAndStates(); | 118 sampler->SetTextureAndStates(); |
| 132 args[2].value_uint32 = sampler->resource_id(); | 119 value = sampler->resource_id(); |
| 133 } | 120 } |
| 134 helper->AddCommand(command_buffer::SET_PARAM_DATA_IMMEDIATE, 3, args); | 121 helper->SetParamDataImmediate(id_, sizeof(value), &value); |
| 135 } | 122 } |
| 136 private: | 123 private: |
| 137 ParamSampler* param_; | 124 ParamSampler* param_; |
| 138 ResourceID id_; | 125 ResourceID id_; |
| 139 }; | 126 }; |
| 140 | 127 |
| 141 static ParamHandlerCB *GetHandlerFromParamAndDesc( | 128 static ParamHandlerCB *GetHandlerFromParamAndDesc( |
| 142 Param *param, | 129 Param *param, |
| 143 const EffectHelper::EffectParamDesc &desc, | 130 const EffectHelper::EffectParamDesc &desc, |
| 144 Effect::MatrixLoadOrder matrix_load_order) { | 131 Effect::MatrixLoadOrder matrix_load_order) { |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 handlers_.clear(); | 277 handlers_.clear(); |
| 291 } | 278 } |
| 292 | 279 |
| 293 void ParamCacheCB::RunHandlers(CommandBufferHelper *helper) { | 280 void ParamCacheCB::RunHandlers(CommandBufferHelper *helper) { |
| 294 for (unsigned int i = 0; i < handlers_.size(); ++i) { | 281 for (unsigned int i = 0; i < handlers_.size(); ++i) { |
| 295 handlers_[i]->SetValue(helper); | 282 handlers_[i]->SetValue(helper); |
| 296 } | 283 } |
| 297 } | 284 } |
| 298 | 285 |
| 299 } // namespace o3d | 286 } // namespace o3d |
| OLD | NEW |