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 "core/sampler.hpp" 24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "pipe/p_state.h" 25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezusing namespace clover; 27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_sampler::_cl_sampler(clover::context &ctx, bool norm_mode, 29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_addressing_mode addr_mode, 30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_filter_mode filter_mode) : 31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ctx(ctx), __norm_mode(norm_mode), 32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez __addr_mode(addr_mode), __filter_mode(filter_mode) { 33c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezbool 36c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_sampler::norm_mode() { 37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return __norm_mode; 38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 40c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezcl_addressing_mode 41c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_sampler::addr_mode() { 42c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return __addr_mode; 43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezcl_filter_mode 46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_sampler::filter_mode() { 47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return __filter_mode; 48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 50c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid * 51c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_sampler::bind(clover::command_queue &q) { 52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez struct pipe_sampler_state info {}; 53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.normalized_coords = norm_mode(); 55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 56c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.wrap_s = info.wrap_t = info.wrap_r = 57c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez (addr_mode() == CL_ADDRESS_CLAMP_TO_EDGE ? PIPE_TEX_WRAP_CLAMP_TO_EDGE : 58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez addr_mode() == CL_ADDRESS_CLAMP ? PIPE_TEX_WRAP_CLAMP_TO_BORDER : 59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez addr_mode() == CL_ADDRESS_REPEAT ? PIPE_TEX_WRAP_REPEAT : 60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez addr_mode() == CL_ADDRESS_MIRRORED_REPEAT ? PIPE_TEX_WRAP_MIRROR_REPEAT : 61c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez PIPE_TEX_WRAP_CLAMP_TO_EDGE); 62c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 63c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.min_img_filter = info.mag_img_filter = 64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez (filter_mode() == CL_FILTER_LINEAR ? PIPE_TEX_FILTER_LINEAR : 65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez PIPE_TEX_FILTER_NEAREST); 66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 67c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return q.pipe->create_sampler_state(q.pipe, &info); 68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 69c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid 71c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_sampler::unbind(clover::command_queue &q, void *st) { 72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez q.pipe->delete_sampler_state(q.pipe, st); 73c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 74