csgfx/renderbuffer.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 2003-2005 by Marten Svanfeldt 00003 Anders Stenberg 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License as published by the Free Software Foundation; either 00008 version 2 of the License, or (at your option) any later version. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Library General Public 00016 License along with this library; if not, write to the Free 00017 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00018 */ 00019 00020 #ifndef __CS_CSGFX_RENDERBUFFER_H__ 00021 #define __CS_CSGFX_RENDERBUFFER_H__ 00022 00027 #include "csextern.h" 00028 #include "csutil/leakguard.h" 00029 #include "csutil/scf_implementation.h" 00030 #include "ivideo/rndbuf.h" 00031 00040 struct csInterleavedSubBufferOptions 00041 { 00043 csRenderBufferComponentType componentType; 00045 uint componentCount; 00046 }; 00047 00048 #ifdef CS_DEBUG 00049 class csCallStack; 00050 #endif 00051 00055 class CS_CRYSTALSPACE_EXPORT csRenderBuffer : 00056 public scfImplementation1<csRenderBuffer, iRenderBuffer> 00057 { 00058 protected: 00062 csRenderBuffer (size_t size, csRenderBufferType type, 00063 csRenderBufferComponentType componentType, uint componentCount, 00064 size_t rangeStart, size_t rangeEnd, bool copy); 00065 public: 00066 CS_LEAKGUARD_DECLARE (csRenderBuffer); 00067 00071 virtual ~csRenderBuffer (); 00072 00075 virtual void* Lock (csRenderBufferLockType lockType); 00076 00077 virtual void Release(); 00078 00079 virtual void CopyInto (const void *data, size_t elementCount, 00080 size_t elemOffset = 0); 00081 00082 virtual int GetComponentCount () const 00083 { 00084 return props.compCount; 00085 } 00086 00087 virtual csRenderBufferComponentType GetComponentType () const 00088 { 00089 return props.comptype; 00090 } 00091 00092 virtual csRenderBufferType GetBufferType() const 00093 { 00094 return props.bufferType; 00095 } 00096 00097 virtual size_t GetSize() const 00098 { 00099 return bufferSize; 00100 } 00101 00102 virtual size_t GetStride() const 00103 { 00104 return props.stride; 00105 } 00106 00107 virtual size_t GetElementDistance() const 00108 { 00109 return props.stride ? props.stride : 00110 props.compCount * csRenderBufferComponentSizes[props.comptype]; 00111 } 00112 00113 virtual size_t GetOffset() const 00114 { return props.offset; } 00115 00117 virtual uint GetVersion () 00118 { 00119 return version; 00120 } 00121 00122 virtual bool IsMasterBuffer () 00123 { 00124 return !masterBuffer.IsValid(); 00125 } 00126 00127 virtual iRenderBuffer* GetMasterBuffer () const 00128 { 00129 return masterBuffer; 00130 } 00131 00132 virtual bool IsIndexBuffer() const 00133 { return props.isIndex; } 00134 00135 virtual size_t GetRangeStart() const 00136 { return rangeStart; } 00137 virtual size_t GetRangeEnd() const 00138 { return rangeEnd; } 00139 00140 virtual size_t GetElementCount() const; 00160 static csRef<csRenderBuffer> CreateRenderBuffer (size_t elementCount, 00161 csRenderBufferType type, csRenderBufferComponentType componentType, 00162 uint componentCount, bool copy = true); 00180 static csRef<csRenderBuffer> CreateIndexRenderBuffer (size_t elementCount, 00181 csRenderBufferType type, csRenderBufferComponentType componentType, 00182 size_t rangeStart, size_t rangeEnd, bool copy = true); 00207 static csRef<csRenderBuffer> CreateInterleavedRenderBuffers ( 00208 size_t elementCount, 00209 csRenderBufferType type, uint count, 00210 const csInterleavedSubBufferOptions* elements, 00211 csRef<iRenderBuffer>* buffers); 00220 static const char* GetDescrFromBufferName (csRenderBufferName bufferName); 00225 static csRenderBufferName GetBufferNameFromDescr (const char* name); 00236 void SetRenderBufferProperties (size_t elementCount, 00237 csRenderBufferType type, csRenderBufferComponentType componentType, 00238 uint componentCount, bool copy = true); 00239 void SetIndexBufferProperties (size_t elementCount, 00240 csRenderBufferType type, csRenderBufferComponentType componentType, 00241 size_t rangeStart, size_t rangeEnd, bool copy = true); 00243 protected: 00245 size_t bufferSize; 00246 00251 struct Props 00252 { 00254 csRenderBufferType bufferType : 2; 00256 csRenderBufferComponentType comptype : 4; 00257 00259 uint compCount : 8; 00261 size_t stride : 8; 00263 size_t offset : 8; 00264 00266 bool doCopy : 1; 00268 bool doDelete : 1; 00270 bool isLocked : 1; 00272 bool isIndex : 1; 00273 00275 uint lastLock : 2; 00276 00277 Props (csRenderBufferType type, csRenderBufferComponentType componentType, 00278 uint componentCount, bool copy) : bufferType (type), 00279 comptype (componentType), compCount (componentCount), stride(0), 00280 offset (0), doCopy (copy), doDelete (false), isLocked (false), 00281 isIndex (false), lastLock (CS_BUF_LOCK_NOLOCK) 00282 { 00283 CS_ASSERT(componentCount <= 255); // Just to be sure... 00284 } 00285 } props; 00286 00288 size_t rangeStart; 00290 size_t rangeEnd; 00291 00293 unsigned int version; 00294 00296 unsigned char *buffer; 00297 00298 csRef<iRenderBuffer> masterBuffer; 00299 #ifdef CS_DEBUG 00300 csCallStack* lockStack; 00301 #endif 00302 }; 00303 00306 #endif // __CS_CSGFX_RENDERBUFFER_H__
Generated for Crystal Space by doxygen 1.4.7