15257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák/************************************************************************** 25257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * 35257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * Copyright 2011 Marek Olšák <maraeo@gmail.com> 45257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * All Rights Reserved. 55257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * 65257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * Permission is hereby granted, free of charge, to any person obtaining a 75257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * copy of this software and associated documentation files (the 85257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * "Software"), to deal in the Software without restriction, including 95257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * without limitation the rights to use, copy, modify, merge, publish, 105257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * distribute, sub license, and/or sell copies of the Software, and to 115257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * permit persons to whom the Software is furnished to do so, subject to 125257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * the following conditions: 135257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * 145257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * The above copyright notice and this permission notice (including the 155257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * next paragraph) shall be included in all copies or substantial portions 165257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * of the Software. 175257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * 185257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 195257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 205257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 215257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * IN NO EVENT SHALL AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR 225257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 235257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 245257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 255257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * 265257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák **************************************************************************/ 275257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 285257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák /* 295257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * Authors: 305257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * Marek Olšák <maraeo@gmail.com> 315257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák */ 325257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 335257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák#include "main/glheader.h" 345257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák#include "main/macros.h" 355257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák#include "pipe/p_context.h" 365257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák#include "pipe/p_screen.h" 375257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák#include "st_context.h" 385257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák#include "st_cb_syncobj.h" 395257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 405257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšákstruct st_sync_object { 415257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák struct gl_sync_object b; 425257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 435257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák struct pipe_fence_handle *fence; 445257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák}; 455257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 465257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 475257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšákstatic struct gl_sync_object * st_new_sync_object(struct gl_context *ctx, 485257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák GLenum type) 495257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák{ 505257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák if (type == GL_SYNC_FENCE) 515257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák return (struct gl_sync_object*)CALLOC_STRUCT(st_sync_object); 525257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák else 535257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák return NULL; 545257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák} 555257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 565257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšákstatic void st_delete_sync_object(struct gl_context *ctx, 575257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák struct gl_sync_object *obj) 585257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák{ 595257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák struct pipe_screen *screen = st_context(ctx)->pipe->screen; 605257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák struct st_sync_object *so = (struct st_sync_object*)obj; 615257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 625257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák screen->fence_reference(screen, &so->fence, NULL); 635257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák FREE(so); 645257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák} 655257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 665257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšákstatic void st_fence_sync(struct gl_context *ctx, struct gl_sync_object *obj, 675257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák GLenum condition, GLbitfield flags) 685257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák{ 695257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák struct pipe_context *pipe = st_context(ctx)->pipe; 705257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák struct st_sync_object *so = (struct st_sync_object*)obj; 715257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 725257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák assert(condition == GL_SYNC_GPU_COMMANDS_COMPLETE && flags == 0); 735257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák assert(so->fence == NULL); 745257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 757e02303497237cde958c28608477d0c355a8038bMarek Olšák pipe->flush(pipe, &so->fence); 765257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák} 775257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 785257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšákstatic void st_check_sync(struct gl_context *ctx, struct gl_sync_object *obj) 795257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák{ 805257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák struct pipe_screen *screen = st_context(ctx)->pipe->screen; 815257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák struct st_sync_object *so = (struct st_sync_object*)obj; 825257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 83bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšák if (so->fence && screen->fence_signalled(screen, so->fence)) { 845257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák screen->fence_reference(screen, &so->fence, NULL); 855257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák so->b.StatusFlag = GL_TRUE; 865257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák } 875257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák} 885257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 895257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšákstatic void st_client_wait_sync(struct gl_context *ctx, 905257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák struct gl_sync_object *obj, 915257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák GLbitfield flags, GLuint64 timeout) 925257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák{ 935257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák struct pipe_screen *screen = st_context(ctx)->pipe->screen; 945257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák struct st_sync_object *so = (struct st_sync_object*)obj; 955257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 965257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák /* We don't care about GL_SYNC_FLUSH_COMMANDS_BIT, because flush is 975257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * already called when creating a fence. */ 985257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 99b39bccbd4ed71e9585da4cf5acf7b887b2e90899Marek Olšák if (so->fence && 100bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšák screen->fence_finish(screen, so->fence, timeout)) { 1015257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák screen->fence_reference(screen, &so->fence, NULL); 1025257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák so->b.StatusFlag = GL_TRUE; 1035257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák } 1045257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák} 1055257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 1065257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšákstatic void st_server_wait_sync(struct gl_context *ctx, 1075257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák struct gl_sync_object *obj, 1085257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák GLbitfield flags, GLuint64 timeout) 1095257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák{ 1105257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák /* NO-OP. 1115257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák * Neither Gallium nor DRM interfaces support blocking on the GPU. */ 1125257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák} 1135257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák 1145257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšákvoid st_init_syncobj_functions(struct dd_function_table *functions) 1155257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák{ 1165257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák functions->NewSyncObject = st_new_sync_object; 1175257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák functions->FenceSync = st_fence_sync; 1185257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák functions->DeleteSyncObject = st_delete_sync_object; 1195257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák functions->CheckSync = st_check_sync; 1205257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák functions->ClientWaitSync = st_client_wait_sync; 1215257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák functions->ServerWaitSync = st_server_wait_sync; 1225257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák} 123