1c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 2c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Copyright 2012 Francisco Jerez 3c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 4c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Permission is hereby granted, free of charge, to any person obtaining a 5c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// copy of this software and associated documentation files (the "Software"), 6c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// to deal in the Software without restriction, including without limitation 7c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// the rights to use, copy, modify, merge, publish, distribute, sublicense, 8c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// and/or sell copies of the Software, and to permit persons to whom the 9c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Software is furnished to do so, subject to the following conditions: 10c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 11c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// The above copyright notice and this permission notice shall be included in 12c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// all copies or substantial portions of the Software. 13c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 14c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// SOFTWARE. 21c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 22c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 23c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include <algorithm> 24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/queue.hpp" 26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/event.hpp" 27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "pipe/p_screen.h" 28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "pipe/p_context.h" 29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezusing namespace clover; 31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_command_queue::_cl_command_queue(context &ctx, device &dev, 33c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_command_queue_properties props) : 34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ctx(ctx), dev(dev), __props(props) { 35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe = dev.pipe->context_create(dev.pipe, NULL); 36c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!pipe) 37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_DEVICE); 38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 40c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_command_queue::~_cl_command_queue() { 41c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe->destroy(pipe); 42c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid 45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_command_queue::flush() { 46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe_screen *screen = dev.pipe; 47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe_fence_handle *fence = NULL; 48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!queued_events.empty()) { 50c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // Find out which events have already been signalled. 51c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez auto first = queued_events.begin(); 52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez auto last = std::find_if(queued_events.begin(), queued_events.end(), 53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez [](event_ptr &ev) { return !ev->signalled(); }); 54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // Flush and fence them. 56c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe->flush(pipe, &fence); 57c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::for_each(first, last, [&](event_ptr &ev) { ev->fence(fence); }); 58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez screen->fence_reference(screen, &fence, NULL); 59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez queued_events.erase(first, last); 60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 61c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 62c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 63c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid 64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_command_queue::sequence(clover::hard_event *ev) { 65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!queued_events.empty()) 66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez queued_events.back()->chain(ev); 67c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez queued_events.push_back(ev); 69c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 70