summaryrefslogtreecommitdiffstats
path: root/o3d/command_buffer/service/effect_d3d9.h
diff options
context:
space:
mode:
Diffstat (limited to 'o3d/command_buffer/service/effect_d3d9.h')
-rw-r--r--o3d/command_buffer/service/effect_d3d9.h139
1 files changed, 139 insertions, 0 deletions
diff --git a/o3d/command_buffer/service/effect_d3d9.h b/o3d/command_buffer/service/effect_d3d9.h
new file mode 100644
index 0000000..cbe32a3
--- /dev/null
+++ b/o3d/command_buffer/service/effect_d3d9.h
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2009, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+// This file contains the definition of the D3D9 versions of effect-related
+// resource classes.
+
+#ifndef GPU_COMMAND_BUFFER_SERVICE_WIN_D3D9_EFFECT_D3D9_H_
+#define GPU_COMMAND_BUFFER_SERVICE_WIN_D3D9_EFFECT_D3D9_H_
+
+#include <vector>
+#include "command_buffer/common/gapi_interface.h"
+#include "command_buffer/service/d3d9_utils.h"
+#include "command_buffer/service/resource.h"
+
+namespace command_buffer {
+namespace o3d {
+
+class GAPID3D9;
+class EffectD3D9;
+
+// ps_2_0 limit
+static const unsigned int kMaxSamplerUnits = 16;
+
+// D3D version of EffectParam. This class keeps a reference to the D3D effect.
+class EffectParamD3D9: public EffectParam {
+ public:
+ EffectParamD3D9(effect_param::DataType data_type,
+ EffectD3D9 *effect,
+ D3DXHANDLE handle);
+ virtual ~EffectParamD3D9();
+
+ // Sets the data into the D3D effect parameter.
+ bool SetData(GAPID3D9 *gapi, unsigned int size, const void * data);
+
+ // Gets the description of the parameter.
+ bool GetDesc(unsigned int size, void *data);
+
+ // Resets the effect back-pointer. This is called when the effect gets
+ // destroyed, to invalidate the parameter.
+ void ResetEffect() { effect_ = NULL; }
+
+ static EffectParamD3D9 *Create(EffectD3D9 *effect, D3DXHANDLE handle);
+ private:
+ EffectD3D9 *effect_;
+ D3DXHANDLE handle_;
+ unsigned int sampler_unit_count_;
+ scoped_array<unsigned int> sampler_units_;
+};
+
+// D3D9 version of Effect.
+class EffectD3D9 : public Effect {
+ public:
+ EffectD3D9(GAPID3D9 *gapi,
+ ID3DXEffect *d3d_effect,
+ ID3DXConstantTable *fs_constant_table,
+ IDirect3DVertexShader9 *d3d_vertex_shader);
+ virtual ~EffectD3D9();
+ // Compiles and creates an effect from source code.
+ static EffectD3D9 *Create(GAPID3D9 *gapi,
+ const String &effect_code,
+ const String &vertex_program_entry,
+ const String &fragment_program_entry);
+ // Applies the effect states (vertex shader, pixel shader) to D3D.
+ bool Begin();
+ // Resets the effect states (vertex shader, pixel shader) to D3D.
+ void End();
+ // Commits parameters to D3D, if they were modified while the effect is
+ // active.
+ bool CommitParameters();
+
+ // Gets the number of parameters in the effect.
+ unsigned int GetParamCount();
+ // Creates an effect parameter with the specified index.
+ EffectParamD3D9 *CreateParam(unsigned int index);
+ // Creates an effect parameter of the specified name.
+ EffectParamD3D9 *CreateParamByName(const char *name);
+ // Gets the number of stream inputs for the effect.
+ unsigned int GetStreamCount();
+ // Gets the stream data with the specified index.
+ bool GetStreamDesc(unsigned int index, unsigned int size, void *data);
+ private:
+ typedef std::vector<EffectParamD3D9 *> ParamList;
+ typedef std::vector<effect_stream::Desc> StreamList;
+
+ // Links a param into this effect.
+ void LinkParam(EffectParamD3D9 *param);
+ // Unlinks a param into this effect.
+ void UnlinkParam(EffectParamD3D9 *param);
+ // Sets sampler states.
+ bool SetSamplers();
+ // Sets streams vector.
+ bool SetStreams();
+
+ GAPID3D9* gapi_;
+ ID3DXEffect *d3d_effect_;
+ IDirect3DVertexShader9 *d3d_vertex_shader_;
+ ID3DXConstantTable *fs_constant_table_;
+ ParamList params_;
+ StreamList streams_;
+ bool sync_parameters_;
+ ResourceId samplers_[kMaxSamplerUnits];
+
+ friend class EffectParamD3D9;
+ DISALLOW_COPY_AND_ASSIGN(EffectD3D9);
+};
+
+} // namespace o3d
+} // namespace command_buffer
+
+#endif // GPU_COMMAND_BUFFER_SERVICE_WIN_D3D9_EFFECT_D3D9_H_