StorageBuffer::StorageBuffer(GraphicContext &gc, const void *data, int size, int stride, BufferUsage usage) : impl(std::make_shared<StorageBuffer_Impl>()) { GraphicContextProvider *gc_provider = gc.get_provider(); impl->provider = gc_provider->alloc_storage_buffer(); impl->provider->create(data, size, stride, usage); }
ShaderObject::ShaderObject(GraphicContext &gc, ShaderType type, const void *source, int source_size) : impl(std::make_shared<ShaderObject_Impl>()) { GraphicContextProvider *gc_provider = gc.get_provider(); impl->provider = gc_provider->alloc_shader_object(); impl->provider->create(type, source, source_size); }
UniformBuffer::UniformBuffer(GraphicContext &gc, const void *data, int size, BufferUsage usage) : impl(std::make_shared<UniformBuffer_Impl>()) { GraphicContextProvider *gc_provider = gc.get_provider(); impl->provider = gc_provider->alloc_uniform_buffer(); impl->provider->create(data, size, usage); }
ShaderObject::ShaderObject(GraphicContext &gc, ShaderType type, const std::vector<std::string> &sources) : impl(std::make_shared<ShaderObject_Impl>()) { GraphicContextProvider *gc_provider = gc.get_provider(); impl->provider = gc_provider->alloc_shader_object(); impl->provider->create(type, sources); }
UniformBuffer::UniformBuffer(GraphicContext &gc, ProgramObject &program, const std::string &name, int num_blocks, BufferUsage usage) : impl(std::make_shared<UniformBuffer_Impl>()) { GraphicContextProvider *gc_provider = gc.get_provider(); impl->provider = gc_provider->alloc_uniform_buffer(); impl->provider->create(program.get_uniform_buffer_size(name) * num_blocks, usage); }
ProgramObject::ProgramObject(GraphicContext &gc) : impl(new ProgramObject_Impl) { GraphicContextProvider *gc_provider = gc.get_provider(); impl->provider = gc_provider->alloc_program_object(); }
TransferBuffer::TransferBuffer(GraphicContext &gc, const void *data, int size, BufferUsage usage) : impl(new TransferBuffer_Impl) { GraphicContextProvider *gc_provider = gc.get_provider(); impl->provider = gc_provider->alloc_transfer_buffer(); impl->provider->create((void*)data, size, usage); }
VertexArrayBuffer::VertexArrayBuffer(GraphicContext &gc, const void *data, int size, BufferUsage usage) : impl(std::make_shared<VertexArrayBuffer_Impl>()) { GraphicContextProvider *gc_provider = gc.get_provider(); impl->provider = gc_provider->alloc_vertex_array_buffer(); impl->provider->create((void*)data, size, usage); }
TransferTexture::TransferTexture(GraphicContext &gc, const PixelBuffer &pbuff, PixelBufferDirection direction, BufferUsage usage) { GraphicContextProvider *gc_provider = gc.get_provider(); PixelBufferProvider *provider = gc_provider->alloc_pixel_buffer(); *this = TransferTexture(provider); provider->create(pbuff.get_data(), pbuff.get_size(), direction, pbuff.get_format(), usage); }
TransferTexture::TransferTexture(GraphicContext &gc, int width, int height, PixelBufferDirection direction, TextureFormat texture_format, const void *data, BufferUsage usage) { GraphicContextProvider *gc_provider = gc.get_provider(); PixelBufferProvider *provider = gc_provider->alloc_pixel_buffer(); *this = TransferTexture(provider); provider->create(data, Size(width, height), direction, texture_format, usage); }
RenderBuffer::RenderBuffer(GraphicContext &context, int width, int height, TextureFormat texture_format, int multisample_samples) : impl(std::make_shared<RenderBuffer_Impl>()) { GraphicContextProvider *gc_provider = context.get_provider(); impl->provider = gc_provider->alloc_render_buffer(); impl->provider->create(width, height, texture_format, multisample_samples); impl->size.width = width; impl->size.height = height; }
void D3DStorageBufferProvider::upload_data(GraphicContext &gc, const void *data, int data_size) { if (data_size != size) throw Exception("Upload data size does not match vertex array buffer"); const ComPtr<ID3D11Device> &device = static_cast<D3DGraphicContextProvider*>(gc.get_provider())->get_window()->get_device(); ComPtr<ID3D11DeviceContext> device_context; device->GetImmediateContext(device_context.output_variable()); device_context->UpdateSubresource(get_handles(device).buffer, 0, 0, data, 0, 0); }
void D3DTransferBufferProvider::lock(GraphicContext &gc, BufferAccess access) { map_device = static_cast<D3DGraphicContextProvider*>(gc.get_provider())->get_window()->get_device(); ComPtr<ID3D11DeviceContext> context; map_device->GetImmediateContext(context.output_variable()); HRESULT result = context->Map(handles.front()->buffer, 0, to_d3d_map_type(access), 0, &map_data); D3DTarget::throw_if_failed("ID3D11DeviceContext.Map failed", result); }
Texture2DArray::Texture2DArray(GraphicContext &context, const Size &size, int array_size, TextureFormat texture_format, int levels) : Texture(std::shared_ptr<Texture_Impl>(new Texture_Impl)) { if ((size.width <= 0) || (size.height <= 0)) throw Exception("An attempt was made to create a Texture with an invalid size"); GraphicContextProvider *gc_provider = context.get_provider(); impl->provider = gc_provider->alloc_texture(texture_2d_array); impl->provider->create(size.width, size.height, 1, array_size, texture_format, levels); impl->width = size.width; impl->height = size.height; impl->array_size = array_size; impl->provider->set_wrap_mode(impl->wrap_mode_s, impl->wrap_mode_t); }
TextureCube::TextureCube(GraphicContext &context, int width, int height, TextureFormat texture_format, int levels) : Texture(std::shared_ptr<Texture_Impl>(new Texture_Impl)) { if ( (width<=0) || (height<=0) ) { throw Exception("An attempt was made to create a Texture with an invalid size"); } GraphicContextProvider *gc_provider = context.get_provider(); impl->provider = gc_provider->alloc_texture(texture_cube); impl->provider->create(width, height, 1, 1, texture_format, levels); impl->width = width; impl->height = height; impl->provider->set_wrap_mode(impl->wrap_mode_s, impl->wrap_mode_t); }
PixelBuffer D3DTextureProvider::get_pixeldata(GraphicContext &gc, TextureFormat texture_format, int level) const { D3DGraphicContextProvider *gc_provider = static_cast<D3DGraphicContextProvider*>(gc.get_provider()); D3DTextureData::DeviceHandles &data_handles = data->get_handles(gc_provider->get_window()->get_device()); int width; int height; DXGI_FORMAT format; if (data_handles.texture_type == D3DTextureData::cl_ID3D11Texture1D) { D3D11_TEXTURE1D_DESC texture_desc; data_handles.get_texture_1d()->GetDesc(&texture_desc); width = max(texture_desc.Width >> level, (UINT)1); height = 1; format = texture_desc.Format; }
Texture3D::Texture3D(GraphicContext &context, const Vec3i &size, TextureFormat texture_format, int levels) : Texture(std::shared_ptr<Texture_Impl>(new Texture_Impl)) { if ( (size.x<=0) || (size.y<=0) || (size.z<=0) ) { throw Exception("An attempt was made to create a Texture with an invalid size"); } GraphicContextProvider *gc_provider = context.get_provider(); impl->provider = gc_provider->alloc_texture(texture_3d); impl->provider->create(size.x, size.y, size.z, 1, texture_format, levels); impl->width = size.x; impl->height = size.y; impl->depth = size.z; impl->provider->set_wrap_mode(impl->wrap_mode_s, impl->wrap_mode_t, impl->wrap_mode_r); }
void D3DVertexArrayBufferProvider::upload_data(GraphicContext &gc, int offset, const void *data, int data_size) { if ((offset < 0) || (data_size < 0) || ((data_size + offset) > size)) throw Exception("Vertex array buffer, invalid size"); const ComPtr<ID3D11Device> &device = static_cast<D3DGraphicContextProvider*>(gc.get_provider())->get_window()->get_device(); ComPtr<ID3D11DeviceContext> device_context; device->GetImmediateContext(device_context.output_variable()); D3D11_BOX box; box.left = offset; box.right = offset + data_size; box.top = 0; box.bottom = 1; box.front = 0; box.back = 1; device_context->UpdateSubresource(get_handles(device).buffer, 0, &box, data, 0, 0); }
void D3DStorageBufferProvider::copy_to(GraphicContext &gc, TransferBuffer &buffer, int dest_pos, int src_pos, int copy_size) { const ComPtr<ID3D11Device> &device = static_cast<D3DGraphicContextProvider*>(gc.get_provider())->get_window()->get_device(); ComPtr<ID3D11Buffer> &transfer_buffer = static_cast<D3DTransferBufferProvider*>(buffer.get_provider())->get_buffer(device); int transfer_buffer_size = static_cast<D3DTransferBufferProvider*>(buffer.get_provider())->get_size(); if (copy_size == -1) copy_size = transfer_buffer_size; if (dest_pos < 0 || copy_size < 0 || dest_pos + copy_size > transfer_buffer_size || src_pos < 0 || src_pos + copy_size > size) throw Exception("Out of bounds!"); ComPtr<ID3D11DeviceContext> device_context; device->GetImmediateContext(device_context.output_variable()); D3D11_BOX box; box.left = dest_pos; box.right = dest_pos + copy_size; box.top = 0; box.bottom = 1; box.front = 0; box.back = 1; device_context->CopySubresourceRegion(transfer_buffer, 0, src_pos, 0, 0, get_handles(device).buffer, 0, &box); }
void Texture2D::copy_image_from(GraphicContext &context, const Rect &pos, int level, TextureFormat texture_format) { impl->provider->copy_image_from(pos.left, pos.top, pos.get_width(), pos.get_height(), level, texture_format, context.get_provider()); }
FrameBuffer::FrameBuffer(GraphicContext &context) : impl(std::make_shared<FrameBuffer_Impl>()) { GraphicContextProvider *gc_provider = context.get_provider(); impl->provider = gc_provider->alloc_frame_buffer(); }
DepthStencilState::DepthStencilState(GraphicContext &context, const DepthStencilStateDescription &desc) : provider(context.get_provider()->create_depth_stencil_state(desc)) { }
void Texture2D::copy_image_from(GraphicContext &context, int x, int y, int width, int height, int level, TextureFormat texture_format) { impl->provider->copy_image_from(x, y, width, height, level, texture_format, context.get_provider()); }
BlendState::BlendState(GraphicContext &context, const BlendStateDescription &desc) : provider(context.get_provider()->create_blend_state(desc)) { }
void Texture2D::copy_subimage_from(GraphicContext &context, const Point &offset, const Rect &pos, int level) { impl->provider->copy_subimage_from(offset.x, offset.y, pos.left, pos.top, pos.get_width(), pos.get_height(), level, context.get_provider()); }
void Texture2D::copy_subimage_from(GraphicContext &context, int offset_x, int offset_y, int x, int y, int width, int height, int level) { impl->provider->copy_subimage_from(offset_x, offset_y, x, y, width, height, level, context.get_provider()); }