void CHardwareTextureBuffer::UnlockSource(CMemoryBuffer & buf) { //BindBuffer(); if(!glUnmapBufferARB(mUsage)) { UnbindBuffer(); throw NOVA_EXP("HardwareVertexBuffer::LockSource(): Can not map v-buffer memory..", BAD_OPERATION); } UnbindBuffer(); }
void Model::Draw(const Matrix4f& transform) const { if (_vbuffer == 0) return; auto video = _context->GetModule<Video>(); if (!video->BindBuffer(_vbuffer, Vertex3::DECLARE.size, Vertex3::DECLARE.types, Vertex3::DECLARE.count)) return; glPushMatrix(); glMultMatrixf(transform.GetData()); video->BindTexture(_texture); if (_ibuffer && video->BindBuffer(_ibuffer, 0, 0, 0)) { video->DrawIndexedPrimitives(_topology, _icount, VALUE_USHORT); video->UnbindBuffer(_ibuffer, 0, 0); } else video->DrawPrimitives(_topology, _vcount, 0); glPopMatrix(); video->UnbindBuffer(_vbuffer, Vertex3::DECLARE.types, Vertex3::DECLARE.count); }
CMemoryBuffer CHardwareTextureBuffer::LockSource(size_t offset, size_t length, THardwareBufferLock opt) { nova::byte *mapper = NULL; CMemoryBuffer result; if((offset + length) > mSize) throw NOVA_EXP("HardwareVertexBuffer::LockSource(): Calling length and size very large..", BAD_OPERATION); BindBuffer(); GLenum method; if(mUsage == GL_PIXEL_UNPACK_BUFFER_ARB) { // Note that glMapBufferARB() causes sync issue. // If GPU is working with this buffer, glMapBufferARB() will wait(stall) // until GPU to finish its job. To avoid waiting (idle), you can call // first glBufferDataARB() with NULL pointer before glMapBufferARB(). // If you do that, the previous data in PBO will be discarded and // glMapBufferARB() returns a new allocated pointer immediately // even if GPU is still working with the previous data. glBufferDataARB(mUsage, mSize, 0, GL_STREAM_DRAW_ARB); method = GL_WRITE_ONLY_ARB; } else method = GL_READ_ONLY_ARB; if((mapper = static_cast<nova::byte *>(glMapBufferARB(mUsage, method))) != NULL) { mapper += offset; CMemoryBuffer res(mapper, length); result = res; } else { UnbindBuffer(); throw NOVA_EXP("HardwareVertexBuffer::LockSource(): Can not map v-buffer memory..", BAD_OPERATION); } //UnbindBuffer(); return result; }
Buffer::Buffer(GraphicsDevice* graphicsDevice,BufferType bufferType, BufferUsage bufferUsage, unsigned int elementSize, unsigned int numberOfElements, GLvoid* bufferData): _graphicsDevice(graphicsDevice), _bufferType(bufferType), _bufferUsage(bufferUsage), _buffer(0), _stride(0), _elementSize(elementSize), _numberOfElements(numberOfElements) { //Generate the buffer _graphicsDevice->GenerateBuffers(1, &_buffer); //Bind the buffer to the context BindBuffer(); //Set the buffer data _graphicsDevice->SetBufferData(_bufferType, (_elementSize * _numberOfElements), bufferData, _bufferUsage); //Unbind the buffer UnbindBuffer(); }
////////////// Index buffer implementation //////////////////////////////////// CHardwareTextureBuffer::CHardwareTextureBuffer(size_t size, THardwareBufferLock opt) { if(mBufID > 0) { if(!CRenderSystem::GetSingelton().CheckCapabilities(BASIC_CATEGORY, CAP_PBO)) throw NOVA_EXP("CHardwareTextureBuffer: You card do not support pbo extention..", BAD_OPERATION); if(size == 0) throw NOVA_EXP("CHardwareTextureBuffer(): You trying to create v-buffer with zero length..", BAD_OPERATION); BindBuffer(); GLuint usage; switch(opt) { case HWB_DYNAMIC: usage = GL_STREAM_READ_ARB; mUsage = GL_PIXEL_PACK_BUFFER_ARB; break; default: usage = GL_STREAM_DRAW_ARB; mUsage = GL_PIXEL_UNPACK_BUFFER_ARB; break; } // Preparing pixel buffer glBufferDataARB(mUsage, size, 0, usage); mReady = true; mSize = size; UnbindBuffer(); } else throw NOVA_EXP("CHardwareTextureBuffer(): v-buffer id not created..", BAD_OPERATION); }
void vsDisplayList::AppendOp(vsDisplayList::op * o) { OpCode type = o->type; switch( type ) { case OpCode_SetColor: SetColor( o->data.GetColor() ); break; case OpCode_SetColors: SetColors( (vsColor*)o->data.p, o->data.GetUInt() ); break; case OpCode_SetColorsBuffer: SetColorsBuffer( (vsRenderBuffer*)o->data.p ); break; case OpCode_VertexArray: VertexArray( (vsVector3D *)o->data.p, o->data.GetUInt() ); break; case OpCode_NormalArray: NormalArray( (vsVector3D *)o->data.p, o->data.GetUInt() ); break; case OpCode_TexelArray: TexelArray( (vsVector2D *)o->data.p, o->data.GetUInt() ); break; case OpCode_ColorArray: ColorArray( (vsColor *)o->data.p, o->data.GetUInt() ); break; case OpCode_VertexBuffer: VertexBuffer( (vsRenderBuffer *)o->data.p ); break; case OpCode_TexelBuffer: TexelBuffer( (vsRenderBuffer *)o->data.p ); break; case OpCode_ColorBuffer: ColorBuffer( (vsRenderBuffer *)o->data.p ); break; case OpCode_BindBuffer: BindBuffer( (vsRenderBuffer *)o->data.p ); break; case OpCode_UnbindBuffer: UnbindBuffer( (vsRenderBuffer *)o->data.p ); break; case OpCode_ClearVertexArray: ClearVertexArray(); break; case OpCode_ClearNormalArray: ClearNormalArray(); break; case OpCode_ClearTexelArray: ClearTexelArray(); break; case OpCode_ClearColorArray: ClearColorArray(); break; case OpCode_ClearArrays: ClearArrays(); break; case OpCode_LineListArray: LineListArray( (int *)o->data.p, o->data.GetUInt() ); break; case OpCode_LineStripArray: LineStripArray( (int *)o->data.p, o->data.GetUInt() ); break; case OpCode_TriangleListArray: TriangleListArray( (int *)o->data.p, o->data.GetUInt() ); break; case OpCode_TriangleStripArray: TriangleStripArray( (int *)o->data.p, o->data.GetUInt() ); break; case OpCode_PointsArray: PointsArray( (int *)o->data.p, o->data.GetUInt() ); break; case OpCode_LineListBuffer: LineListBuffer( (vsRenderBuffer *)o->data.p ); break; case OpCode_LineStripBuffer: LineStripBuffer( (vsRenderBuffer *)o->data.p ); break; case OpCode_TriangleStripBuffer: TriangleStripBuffer( (vsRenderBuffer *)o->data.p ); break; case OpCode_TriangleFanArray: TriangleFanArray( (int *)o->data.p, o->data.GetUInt() ); break; case OpCode_PushTransform: PushTransform( o->data.GetTransform() ); break; case OpCode_SetCameraTransform: SetCameraTransform( o->data.GetTransform() ); break; case OpCode_SetMatrix4x4: SetMatrix4x4( o->data.GetMatrix4x4() ); break; case OpCode_PushMatrix4x4: PushMatrix4x4( o->data.GetMatrix4x4() ); break; case OpCode_SetMatrices4x4: SetMatrices4x4( (vsMatrix4x4*)o->data.p, o->data.i ); break; case OpCode_SetMatrices4x4Buffer: SetMatrices4x4Buffer( (vsRenderBuffer*)o->data.p ); break; case OpCode_SetWorldToViewMatrix4x4: SetWorldToViewMatrix4x4( o->data.GetMatrix4x4() ); break; case OpCode_Set3DProjection: Set3DProjection( o->data.fov, o->data.nearPlane, o->data.farPlane ); break; case OpCode_SetProjectionMatrix4x4: SetProjectionMatrix4x4( o->data.GetMatrix4x4() ); break; case OpCode_PopTransform: PopTransform(); break; case OpCode_EnableStencil: EnableStencil(); break; case OpCode_DisableStencil: DisableStencil(); break; case OpCode_EnableScissor: EnableScissor( o->data.GetBox2D() ); break; case OpCode_DisableScissor: DisableScissor(); break; case OpCode_ClearStencil: ClearStencil(); break; case OpCode_SetViewport: SetViewport( o->data.GetBox2D() ); break; case OpCode_ClearViewport: ClearViewport(); break; case OpCode_Debug: Debug( o->data.GetString() ); break; default: break; } }