Path: blob/21.2-virgl/src/gallium/auxiliary/vl/vl_vertex_buffers.c
4565 views
/**************************************************************************1*2* Copyright 2010 Christian König3* All Rights Reserved.4*5* Permission is hereby granted, free of charge, to any person obtaining a6* copy of this software and associated documentation files (the7* "Software"), to deal in the Software without restriction, including8* without limitation the rights to use, copy, modify, merge, publish,9* distribute, sub license, and/or sell copies of the Software, and to10* permit persons to whom the Software is furnished to do so, subject to11* the following conditions:12*13* The above copyright notice and this permission notice (including the14* next paragraph) shall be included in all copies or substantial portions15* of the Software.16*17* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS18* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF19* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.20* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR21* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,22* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE23* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.24*25**************************************************************************/2627#include <assert.h>28#include "util/format/u_format.h"29#include "vl_vertex_buffers.h"30#include "vl_types.h"3132/* vertices for a quad covering a block */33static const struct vertex2f block_quad[4] = {34{0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f}35};3637struct pipe_vertex_buffer38vl_vb_upload_quads(struct pipe_context *pipe)39{40struct pipe_vertex_buffer quad;41struct pipe_transfer *buf_transfer;42struct vertex2f *v;4344unsigned i;4546assert(pipe);4748/* create buffer */49quad.stride = sizeof(struct vertex2f);50quad.buffer_offset = 0;51quad.buffer.resource = pipe_buffer_create52(53pipe->screen,54PIPE_BIND_VERTEX_BUFFER,55PIPE_USAGE_DEFAULT,56sizeof(struct vertex2f) * 457);58quad.is_user_buffer = false;5960if(!quad.buffer.resource)61return quad;6263/* and fill it */64v = pipe_buffer_map65(66pipe,67quad.buffer.resource,68PIPE_MAP_WRITE | PIPE_MAP_DISCARD_RANGE,69&buf_transfer70);7172for (i = 0; i < 4; ++i, ++v) {73v->x = block_quad[i].x;74v->y = block_quad[i].y;75}7677pipe_buffer_unmap(pipe, buf_transfer);7879return quad;80}8182struct pipe_vertex_buffer83vl_vb_upload_pos(struct pipe_context *pipe, unsigned width, unsigned height)84{85struct pipe_vertex_buffer pos;86struct pipe_transfer *buf_transfer;87struct vertex2s *v;8889unsigned x, y;9091assert(pipe);9293/* create buffer */94pos.stride = sizeof(struct vertex2s);95pos.buffer_offset = 0;96pos.buffer.resource = pipe_buffer_create97(98pipe->screen,99PIPE_BIND_VERTEX_BUFFER,100PIPE_USAGE_DEFAULT,101sizeof(struct vertex2s) * width * height102);103pos.is_user_buffer = false;104105if(!pos.buffer.resource)106return pos;107108/* and fill it */109v = pipe_buffer_map110(111pipe,112pos.buffer.resource,113PIPE_MAP_WRITE | PIPE_MAP_DISCARD_RANGE,114&buf_transfer115);116117for ( y = 0; y < height; ++y) {118for ( x = 0; x < width; ++x, ++v) {119v->x = x;120v->y = y;121}122}123124pipe_buffer_unmap(pipe, buf_transfer);125126return pos;127}128129static struct pipe_vertex_element130vl_vb_get_quad_vertex_element(void)131{132struct pipe_vertex_element element;133134/* setup rectangle element */135element.src_offset = 0;136element.instance_divisor = 0;137element.vertex_buffer_index = 0;138element.src_format = PIPE_FORMAT_R32G32_FLOAT;139140return element;141}142143static void144vl_vb_element_helper(struct pipe_vertex_element* elements, unsigned num_elements,145unsigned vertex_buffer_index)146{147unsigned i, offset = 0;148149assert(elements && num_elements);150151for ( i = 0; i < num_elements; ++i ) {152elements[i].src_offset = offset;153elements[i].instance_divisor = 1;154elements[i].vertex_buffer_index = vertex_buffer_index;155offset += util_format_get_blocksize(elements[i].src_format);156}157}158159void *160vl_vb_get_ves_ycbcr(struct pipe_context *pipe)161{162struct pipe_vertex_element vertex_elems[NUM_VS_INPUTS];163164assert(pipe);165166memset(&vertex_elems, 0, sizeof(vertex_elems));167vertex_elems[VS_I_RECT] = vl_vb_get_quad_vertex_element();168169/* Position element */170vertex_elems[VS_I_VPOS].src_format = PIPE_FORMAT_R8G8B8A8_USCALED;171172/* block num element */173vertex_elems[VS_I_BLOCK_NUM].src_format = PIPE_FORMAT_R32_FLOAT;174175vl_vb_element_helper(&vertex_elems[VS_I_VPOS], 2, 1);176177return pipe->create_vertex_elements_state(pipe, 3, vertex_elems);178}179180void *181vl_vb_get_ves_mv(struct pipe_context *pipe)182{183struct pipe_vertex_element vertex_elems[NUM_VS_INPUTS];184185assert(pipe);186187memset(&vertex_elems, 0, sizeof(vertex_elems));188vertex_elems[VS_I_RECT] = vl_vb_get_quad_vertex_element();189190/* Position element */191vertex_elems[VS_I_VPOS].src_format = PIPE_FORMAT_R16G16_SSCALED;192193vl_vb_element_helper(&vertex_elems[VS_I_VPOS], 1, 1);194195/* motion vector TOP element */196vertex_elems[VS_I_MV_TOP].src_format = PIPE_FORMAT_R16G16B16A16_SSCALED;197198/* motion vector BOTTOM element */199vertex_elems[VS_I_MV_BOTTOM].src_format = PIPE_FORMAT_R16G16B16A16_SSCALED;200201vl_vb_element_helper(&vertex_elems[VS_I_MV_TOP], 2, 2);202203return pipe->create_vertex_elements_state(pipe, NUM_VS_INPUTS, vertex_elems);204}205206bool207vl_vb_init(struct vl_vertex_buffer *buffer, struct pipe_context *pipe,208unsigned width, unsigned height)209{210unsigned i, size;211212assert(buffer);213214buffer->width = width;215buffer->height = height;216217size = width * height;218219for (i = 0; i < VL_NUM_COMPONENTS; ++i) {220buffer->ycbcr[i].resource = pipe_buffer_create221(222pipe->screen,223PIPE_BIND_VERTEX_BUFFER,224PIPE_USAGE_STREAM,225sizeof(struct vl_ycbcr_block) * size * 4226);227if (!buffer->ycbcr[i].resource)228goto error_ycbcr;229}230231for (i = 0; i < VL_MAX_REF_FRAMES; ++i) {232buffer->mv[i].resource = pipe_buffer_create233(234pipe->screen,235PIPE_BIND_VERTEX_BUFFER,236PIPE_USAGE_STREAM,237sizeof(struct vl_motionvector) * size238);239if (!buffer->mv[i].resource)240goto error_mv;241}242243return true;244245error_mv:246for (i = 0; i < VL_NUM_COMPONENTS; ++i)247pipe_resource_reference(&buffer->mv[i].resource, NULL);248249error_ycbcr:250for (i = 0; i < VL_NUM_COMPONENTS; ++i)251pipe_resource_reference(&buffer->ycbcr[i].resource, NULL);252return false;253}254255unsigned256vl_vb_attributes_per_plock(struct vl_vertex_buffer *buffer)257{258return 1;259}260261struct pipe_vertex_buffer262vl_vb_get_ycbcr(struct vl_vertex_buffer *buffer, int component)263{264struct pipe_vertex_buffer buf;265266assert(buffer);267268buf.stride = sizeof(struct vl_ycbcr_block);269buf.buffer_offset = 0;270buf.buffer.resource = buffer->ycbcr[component].resource;271buf.is_user_buffer = false;272273return buf;274}275276struct pipe_vertex_buffer277vl_vb_get_mv(struct vl_vertex_buffer *buffer, int motionvector)278{279struct pipe_vertex_buffer buf;280281assert(buffer);282283buf.stride = sizeof(struct vl_motionvector);284buf.buffer_offset = 0;285buf.buffer.resource = buffer->mv[motionvector].resource;286buf.is_user_buffer = false;287288return buf;289}290291void292vl_vb_map(struct vl_vertex_buffer *buffer, struct pipe_context *pipe)293{294unsigned i;295296assert(buffer && pipe);297298for (i = 0; i < VL_NUM_COMPONENTS; ++i) {299buffer->ycbcr[i].vertex_stream = pipe_buffer_map300(301pipe,302buffer->ycbcr[i].resource,303PIPE_MAP_WRITE | PIPE_MAP_DISCARD_RANGE,304&buffer->ycbcr[i].transfer305);306}307308for (i = 0; i < VL_MAX_REF_FRAMES; ++i) {309buffer->mv[i].vertex_stream = pipe_buffer_map310(311pipe,312buffer->mv[i].resource,313PIPE_MAP_WRITE | PIPE_MAP_DISCARD_RANGE,314&buffer->mv[i].transfer315);316}317318}319320struct vl_ycbcr_block *321vl_vb_get_ycbcr_stream(struct vl_vertex_buffer *buffer, int component)322{323assert(buffer);324assert(component < VL_NUM_COMPONENTS);325326return buffer->ycbcr[component].vertex_stream;327}328329unsigned330vl_vb_get_mv_stream_stride(struct vl_vertex_buffer *buffer)331{332assert(buffer);333334return buffer->width;335}336337struct vl_motionvector *338vl_vb_get_mv_stream(struct vl_vertex_buffer *buffer, int ref_frame)339{340assert(buffer);341assert(ref_frame < VL_MAX_REF_FRAMES);342343return buffer->mv[ref_frame].vertex_stream;344}345346void347vl_vb_unmap(struct vl_vertex_buffer *buffer, struct pipe_context *pipe)348{349unsigned i;350351assert(buffer && pipe);352353for (i = 0; i < VL_NUM_COMPONENTS; ++i) {354if (buffer->ycbcr[i].transfer)355pipe_buffer_unmap(pipe, buffer->ycbcr[i].transfer);356}357358for (i = 0; i < VL_MAX_REF_FRAMES; ++i) {359if (buffer->mv[i].transfer)360pipe_buffer_unmap(pipe, buffer->mv[i].transfer);361}362}363364void365vl_vb_cleanup(struct vl_vertex_buffer *buffer)366{367unsigned i;368369assert(buffer);370371for (i = 0; i < VL_NUM_COMPONENTS; ++i) {372pipe_resource_reference(&buffer->ycbcr[i].resource, NULL);373}374375for (i = 0; i < VL_MAX_REF_FRAMES; ++i) {376pipe_resource_reference(&buffer->mv[i].resource, NULL);377}378}379380381