101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell/************************************************************************** 201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * All Rights Reserved. 501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * copy of this software and associated documentation files (the 801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * "Software"), to deal in the Software without restriction, including 901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 1001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 1101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * permit persons to whom the Software is furnished to do so, subject to 1201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * the following conditions: 1301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 1401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * The above copyright notice and this permission notice (including the 1501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * next paragraph) shall be included in all copies or substantial portions 1601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * of the Software. 1701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 1801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 2601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell **************************************************************************/ 2701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 28287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "i915_surface.h" 29287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "i915_resource.h" 30fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter#include "i915_state.h" 3111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer#include "i915_blit.h" 324bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger#include "i915_reg.h" 33287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "i915_screen.h" 3401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "pipe/p_defines.h" 35287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "util/u_inlines.h" 36287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "util/u_math.h" 37b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol#include "util/u_format.h" 38287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "util/u_memory.h" 394bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger#include "util/u_pack_color.h" 40883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák#include "util/u_surface.h" 4101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 42fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter/* 43fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter * surface functions using the render engine 44fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter */ 45fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter 46fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetterstatic void 47f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetteri915_surface_copy_render(struct pipe_context *pipe, 48f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter struct pipe_resource *dst, unsigned dst_level, 49f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter unsigned dstx, unsigned dsty, unsigned dstz, 50f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter struct pipe_resource *src, unsigned src_level, 51f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter const struct pipe_box *src_box) 52f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter{ 53f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter struct i915_context *i915 = i915_context(pipe); 54f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter 55883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák /* Fallback for buffers. */ 56883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) { 57883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák util_resource_copy_region(pipe, dst, dst_level, dstx, dsty, dstz, 58883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák src, src_level, src_box); 59883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák return; 60883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák } 61883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák 6284645fa61390475e6efb080685e0dec059622a39Marek Olšák if (!util_blitter_is_copy_supported(i915->blitter, dst, src, 6384645fa61390475e6efb080685e0dec059622a39Marek Olšák PIPE_MASK_RGBAZS)) { 6484645fa61390475e6efb080685e0dec059622a39Marek Olšák util_resource_copy_region(pipe, dst, dst_level, dstx, dsty, dstz, 6584645fa61390475e6efb080685e0dec059622a39Marek Olšák src, src_level, src_box); 6684645fa61390475e6efb080685e0dec059622a39Marek Olšák return; 6784645fa61390475e6efb080685e0dec059622a39Marek Olšák } 6884645fa61390475e6efb080685e0dec059622a39Marek Olšák 69f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter util_blitter_save_blend(i915->blitter, (void *)i915->blend); 70f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter util_blitter_save_depth_stencil_alpha(i915->blitter, (void *)i915->depth_stencil); 71f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter util_blitter_save_stencil_ref(i915->blitter, &i915->stencil_ref); 72f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter util_blitter_save_rasterizer(i915->blitter, (void *)i915->rasterizer); 73f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter util_blitter_save_fragment_shader(i915->blitter, i915->saved_fs); 74f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter util_blitter_save_vertex_shader(i915->blitter, i915->saved_vs); 75f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter util_blitter_save_viewport(i915->blitter, &i915->viewport); 76f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter util_blitter_save_vertex_elements(i915->blitter, i915->saved_velems); 77f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter util_blitter_save_vertex_buffers(i915->blitter, i915->saved_nr_vertex_buffers, 78f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter i915->saved_vertex_buffers); 79f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter 80f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter util_blitter_save_framebuffer(i915->blitter, &i915->framebuffer); 81f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter 82f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter util_blitter_save_fragment_sampler_states(i915->blitter, 83f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter i915->saved_nr_samplers, 84f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter i915->saved_samplers); 85f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter util_blitter_save_fragment_sampler_views(i915->blitter, 86f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter i915->saved_nr_sampler_views, 87f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter i915->saved_sampler_views); 88f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter 89825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák util_blitter_copy_texture(i915->blitter, dst, dst_level, ~0, dstx, dsty, dstz, 90825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák src, src_level, 0, src_box); 91f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter} 92f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter 93f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetterstatic void 94fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetteri915_clear_render_target_render(struct pipe_context *pipe, 95fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter struct pipe_surface *dst, 966dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 97fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter unsigned dstx, unsigned dsty, 98fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter unsigned width, unsigned height) 99fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter{ 100fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter struct i915_context *i915 = i915_context(pipe); 101fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter struct pipe_framebuffer_state fb_state; 102fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter 103fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter util_blitter_save_framebuffer(i915->blitter, &i915->framebuffer); 104fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter 105fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter fb_state.width = dst->width; 106fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter fb_state.height = dst->height; 107fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter fb_state.nr_cbufs = 1; 108fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter fb_state.cbufs[0] = dst; 109fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter fb_state.zsbuf = NULL; 110fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter pipe->set_framebuffer_state(pipe, &fb_state); 111fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter 112fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter if (i915->dirty) 113fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter i915_update_derived(i915); 114fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter 1156dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie i915_clear_emit(pipe, PIPE_CLEAR_COLOR, color, 0.0, 0x0, 116fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter dstx, dsty, width, height); 117fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter 118fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter pipe->set_framebuffer_state(pipe, &i915->blitter->saved_fb_state); 119fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter util_unreference_framebuffer_state(&i915->blitter->saved_fb_state); 120fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter i915->blitter->saved_fb_state.nr_cbufs = ~0; 121fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter} 122fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter 123fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetterstatic void 124fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetteri915_clear_depth_stencil_render(struct pipe_context *pipe, 125fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter struct pipe_surface *dst, 126fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter unsigned clear_flags, 127fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter double depth, 128fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter unsigned stencil, 129fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter unsigned dstx, unsigned dsty, 130fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter unsigned width, unsigned height) 131fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter{ 132fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter struct i915_context *i915 = i915_context(pipe); 133fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter struct pipe_framebuffer_state fb_state; 134fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter 135fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter util_blitter_save_framebuffer(i915->blitter, &i915->framebuffer); 136fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter 137fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter fb_state.width = dst->width; 138fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter fb_state.height = dst->height; 139fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter fb_state.nr_cbufs = 0; 140fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter fb_state.zsbuf = dst; 141fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter pipe->set_framebuffer_state(pipe, &fb_state); 142fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter 143fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter if (i915->dirty) 144fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter i915_update_derived(i915); 145fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter 146fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter i915_clear_emit(pipe, clear_flags & PIPE_CLEAR_DEPTHSTENCIL, 147fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter NULL, depth, stencil, 148fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter dstx, dsty, width, height); 149fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter 150fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter pipe->set_framebuffer_state(pipe, &i915->blitter->saved_fb_state); 151fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter util_unreference_framebuffer_state(&i915->blitter->saved_fb_state); 152fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter i915->blitter->saved_fb_state.nr_cbufs = ~0; 153fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter} 154fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter 155fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter/* 156fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter * surface functions using the blitter 157fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter */ 15801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 15911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer/* Assumes all values are within bounds -- no checking at this level - 16011a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer * do it higher up if required. 16111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer */ 16211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzerstatic void 163f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetteri915_surface_copy_blitter(struct pipe_context *pipe, 164f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter struct pipe_resource *dst, unsigned dst_level, 165f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter unsigned dstx, unsigned dsty, unsigned dstz, 166f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter struct pipe_resource *src, unsigned src_level, 167f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter const struct pipe_box *src_box) 16811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer{ 169bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger struct i915_texture *dst_tex = i915_texture(dst); 170bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger struct i915_texture *src_tex = i915_texture(src); 171287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *dpt = &dst_tex->b.b; 172287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *spt = &src_tex->b.b; 173bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger unsigned dst_offset, src_offset; /* in bytes */ 174bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger 175883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák /* Fallback for buffers. */ 176883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) { 177883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák util_resource_copy_region(pipe, dst, dst_level, dstx, dsty, dstz, 178883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák src, src_level, src_box); 179883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák return; 180883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák } 181883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák 1824c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger /* XXX cannot copy 3d regions at this time */ 1834c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger assert(src_box->depth == 1); 1844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger if (dst->target != PIPE_TEXTURE_CUBE && 1854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger dst->target != PIPE_TEXTURE_3D) 186bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger assert(dstz == 0); 1874c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger dst_offset = i915_texture_offset(dst_tex, dst_level, dstz); 188bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger 1894c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger if (src->target != PIPE_TEXTURE_CUBE && 1904c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger src->target != PIPE_TEXTURE_3D) 1914c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger assert(src_box->z == 0); 1924c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger src_offset = i915_texture_offset(src_tex, src_level, src_box->z); 19311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer 194b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert( util_format_get_blocksize(dpt->format) == util_format_get_blocksize(spt->format) ); 195b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert( util_format_get_blockwidth(dpt->format) == util_format_get_blockwidth(spt->format) ); 196b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert( util_format_get_blockheight(dpt->format) == util_format_get_blockheight(spt->format) ); 197b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert( util_format_get_blockwidth(dpt->format) == 1 ); 198b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert( util_format_get_blockheight(dpt->format) == 1 ); 19911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer 200b89aa1d87ad6cebdbb3f2067863c600f50bf0ff1Michel Dänzer i915_copy_blit( i915_context(pipe), 201b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol util_format_get_blocksize(dpt->format), 202bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger (unsigned short) src_tex->stride, src_tex->buffer, src_offset, 203bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger (unsigned short) dst_tex->stride, dst_tex->buffer, dst_offset, 2044c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger (short) src_box->x, (short) src_box->y, (short) dstx, (short) dsty, 2054c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger (short) src_box->width, (short) src_box->height ); 20611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer} 20711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer 20811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzerstatic void 209fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetteri915_clear_render_target_blitter(struct pipe_context *pipe, 210fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter struct pipe_surface *dst, 2116dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 212fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter unsigned dstx, unsigned dsty, 213fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter unsigned width, unsigned height) 21411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer{ 2154bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger struct i915_texture *tex = i915_texture(dst->texture); 216287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *pt = &tex->b.b; 2174bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger union util_color uc; 2184c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned offset = i915_texture_offset(tex, dst->u.tex.level, dst->u.tex.first_layer); 219c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell 220b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(util_format_get_blockwidth(pt->format) == 1); 221b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(util_format_get_blockheight(pt->format) == 1); 222c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzer 2236dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie util_pack_color(color->f, dst->format, &uc); 224b89aa1d87ad6cebdbb3f2067863c600f50bf0ff1Michel Dänzer i915_fill_blit( i915_context(pipe), 225b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol util_format_get_blocksize(pt->format), 2264bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger XY_COLOR_BLT_WRITE_ALPHA | XY_COLOR_BLT_WRITE_RGB, 227b89aa1d87ad6cebdbb3f2067863c600f50bf0ff1Michel Dänzer (unsigned short) tex->stride, 2284c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger tex->buffer, offset, 229b89aa1d87ad6cebdbb3f2067863c600f50bf0ff1Michel Dänzer (short) dstx, (short) dsty, 230b89aa1d87ad6cebdbb3f2067863c600f50bf0ff1Michel Dänzer (short) width, (short) height, 2314bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger uc.ui ); 23211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer} 23311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer 2344bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheideggerstatic void 235fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetteri915_clear_depth_stencil_blitter(struct pipe_context *pipe, 236fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter struct pipe_surface *dst, 237fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter unsigned clear_flags, 238fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter double depth, 239fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter unsigned stencil, 240fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter unsigned dstx, unsigned dsty, 241fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter unsigned width, unsigned height) 2424bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger{ 2434bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger struct i915_texture *tex = i915_texture(dst->texture); 2444bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger struct pipe_resource *pt = &tex->b.b; 2454bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger unsigned packedds; 2464bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger unsigned mask = 0; 2474c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned offset = i915_texture_offset(tex, dst->u.tex.level, dst->u.tex.first_layer); 2484bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger 2494bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger assert(util_format_get_blockwidth(pt->format) == 1); 2504bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger assert(util_format_get_blockheight(pt->format) == 1); 2514bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger 2524bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger packedds = util_pack_z_stencil(dst->format, depth, stencil); 2534bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger 2544bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger if (clear_flags & PIPE_CLEAR_DEPTH) 2554bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger mask |= XY_COLOR_BLT_WRITE_RGB; 2564bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger /* XXX presumably this does read-modify-write 2574bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger (otherwise this won't work anyway). Hence will only want to 2584bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger do it if really have stencil and it isn't cleared */ 259b6cd0712e9961c5cfbc94b5e59467ed90aeb3a2fRoland Scheidegger if ((clear_flags & PIPE_CLEAR_STENCIL) || 260866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie (dst->format != PIPE_FORMAT_Z24_UNORM_S8_UINT)) 2614bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger mask |= XY_COLOR_BLT_WRITE_ALPHA; 2624bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger 2634bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger i915_fill_blit( i915_context(pipe), 2644bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger util_format_get_blocksize(pt->format), 2654bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger mask, 2664bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger (unsigned short) tex->stride, 2674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger tex->buffer, offset, 2684bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger (short) dstx, (short) dsty, 2694bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger (short) width, (short) height, 2704bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger packedds ); 2714bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger} 27211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer 273287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* 274287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell * Screen surface functions 275287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */ 276287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 277287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 278287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic struct pipe_surface * 2794c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheideggeri915_create_surface(struct pipe_context *ctx, 2804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_resource *pt, 2814c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger const struct pipe_surface *surf_tmpl) 282287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 283287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_surface *ps; 284287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 2854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger assert(surf_tmpl->u.tex.first_layer == surf_tmpl->u.tex.last_layer); 2864c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger if (pt->target != PIPE_TEXTURE_CUBE && 2874c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger pt->target != PIPE_TEXTURE_3D) 2884c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger assert(surf_tmpl->u.tex.first_layer == 0); 289287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 290287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell ps = CALLOC_STRUCT(pipe_surface); 291287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (ps) { 2924c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger /* could subclass pipe_surface and store offset as it used to do */ 293287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_reference_init(&ps->reference, 1); 294287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&ps->texture, pt); 2954c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger ps->format = surf_tmpl->format; 2964c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger ps->width = u_minify(pt->width0, surf_tmpl->u.tex.level); 2974c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger ps->height = u_minify(pt->height0, surf_tmpl->u.tex.level); 2984c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger ps->u.tex.level = surf_tmpl->u.tex.level; 2994c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger ps->u.tex.first_layer = surf_tmpl->u.tex.first_layer; 3004c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger ps->u.tex.last_layer = surf_tmpl->u.tex.last_layer; 3014c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger ps->usage = surf_tmpl->usage; 3024c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger ps->context = ctx; 303287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell } 304287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return ps; 305287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 306287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 307287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic void 3084c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheideggeri915_surface_destroy(struct pipe_context *ctx, 3094c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_surface *surf) 310287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 311287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&surf->texture, NULL); 312287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell FREE(surf); 313287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 314287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 315287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 31601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellvoid 31701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwelli915_init_surface_functions(struct i915_context *i915) 31801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{ 319fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter if (i915_screen(i915->base.screen)->debug.use_blitter) { 320f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter i915->base.resource_copy_region = i915_surface_copy_blitter; 321fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter i915->base.clear_render_target = i915_clear_render_target_blitter; 322fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter i915->base.clear_depth_stencil = i915_clear_depth_stencil_blitter; 323fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter } else { 324f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter i915->base.resource_copy_region = i915_surface_copy_render; 325fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter i915->base.clear_render_target = i915_clear_render_target_render; 326fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter i915->base.clear_depth_stencil = i915_clear_depth_stencil_render; 327fb3b712b84528b192834d3ba3df557b25bbe6e6eDaniel Vetter } 3284c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger i915->base.create_surface = i915_create_surface; 3294c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger i915->base.surface_destroy = i915_surface_destroy; 330287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 331