1/* 2 * Copyright (C) 2014 Broadcom 3 * Copyright (C) 2019 Collabora, Ltd. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 * 24 * Authors (Collabora): 25 * Tomeu Vizoso <tomeu.vizoso@collabora.com> 26 * Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> 27 * 28 */ 29 30#include "pan_context.h" 31#include "pan_util.h" 32#include "util/format/u_format.h" 33 34void 35panfrost_blitter_save(struct panfrost_context *ctx, bool render_cond) 36{ 37 struct blitter_context *blitter = ctx->blitter; 38 39 util_blitter_save_vertex_buffer_slot(blitter, ctx->vertex_buffers); 40 util_blitter_save_vertex_elements(blitter, ctx->vertex); 41 util_blitter_save_vertex_shader(blitter, ctx->shader[PIPE_SHADER_VERTEX]); 42 util_blitter_save_rasterizer(blitter, ctx->rasterizer); 43 util_blitter_save_viewport(blitter, &ctx->pipe_viewport); 44 util_blitter_save_scissor(blitter, &ctx->scissor); 45 util_blitter_save_fragment_shader(blitter, ctx->shader[PIPE_SHADER_FRAGMENT]); 46 util_blitter_save_blend(blitter, ctx->blend); 47 util_blitter_save_depth_stencil_alpha(blitter, ctx->depth_stencil); 48 util_blitter_save_stencil_ref(blitter, &ctx->stencil_ref); 49 util_blitter_save_so_targets(blitter, 0, NULL); 50 util_blitter_save_sample_mask(blitter, ctx->sample_mask, ctx->min_samples); 51 52 util_blitter_save_framebuffer(blitter, &ctx->pipe_framebuffer); 53 util_blitter_save_fragment_sampler_states(blitter, 54 ctx->sampler_count[PIPE_SHADER_FRAGMENT], 55 (void **)(&ctx->samplers[PIPE_SHADER_FRAGMENT])); 56 util_blitter_save_fragment_sampler_views(blitter, 57 ctx->sampler_view_count[PIPE_SHADER_FRAGMENT], 58 (struct pipe_sampler_view **)&ctx->sampler_views[PIPE_SHADER_FRAGMENT]); 59 util_blitter_save_fragment_constant_buffer_slot(blitter, 60 ctx->constant_buffer[PIPE_SHADER_FRAGMENT].cb); 61 62 if (!render_cond) { 63 util_blitter_save_render_condition(blitter, 64 (struct pipe_query *) ctx->cond_query, 65 ctx->cond_cond, ctx->cond_mode); 66 } 67 68} 69 70void 71panfrost_blit(struct pipe_context *pipe, 72 const struct pipe_blit_info *info) 73{ 74 struct panfrost_context *ctx = pan_context(pipe); 75 76 if (info->render_condition_enable && 77 !panfrost_render_condition_check(ctx)) 78 return; 79 80 if (!util_blitter_is_blit_supported(ctx->blitter, info)) 81 unreachable("Unsupported blit\n"); 82 83 panfrost_blitter_save(ctx, info->render_condition_enable); 84 util_blitter_blit(ctx->blitter, info); 85} 86