ilo_blitter is just a wrapper for util_blitter for now. We will port BLT code to ilo_blitter shortly.tags/mesa-9.2-rc1
@@ -5,6 +5,8 @@ C_SOURCES := \ | |||
ilo_3d_pipeline_gen6.c \ | |||
ilo_3d_pipeline_gen7.c \ | |||
ilo_blit.c \ | |||
ilo_blitter.c \ | |||
ilo_blitter_pipe.c \ | |||
ilo_context.c \ | |||
ilo_cp.c \ | |||
ilo_format.c \ |
@@ -25,12 +25,11 @@ | |||
* Chia-I Wu <olv@lunarg.com> | |||
*/ | |||
#include "util/u_blitter.h" | |||
#include "util/u_clear.h" | |||
#include "util/u_pack_color.h" | |||
#include "util/u_surface.h" | |||
#include "intel_reg.h" | |||
#include "ilo_blitter.h" | |||
#include "ilo_context.h" | |||
#include "ilo_cp.h" | |||
#include "ilo_resource.h" | |||
@@ -532,62 +531,6 @@ blitter_xy_color_blt(struct pipe_context *pipe, | |||
return true; | |||
} | |||
enum ilo_blitter_op { | |||
ILO_BLITTER_CLEAR, | |||
ILO_BLITTER_CLEAR_SURFACE, | |||
ILO_BLITTER_BLIT, | |||
}; | |||
static void | |||
ilo_blitter_begin(struct ilo_context *ilo, enum ilo_blitter_op op) | |||
{ | |||
/* as documented in util/u_blitter.h */ | |||
util_blitter_save_vertex_buffer_slot(ilo->blitter, ilo->vb.states); | |||
util_blitter_save_vertex_elements(ilo->blitter, (void *) ilo->ve); | |||
util_blitter_save_vertex_shader(ilo->blitter, ilo->vs); | |||
util_blitter_save_geometry_shader(ilo->blitter, ilo->gs); | |||
util_blitter_save_so_targets(ilo->blitter, ilo->so.count, ilo->so.states); | |||
util_blitter_save_fragment_shader(ilo->blitter, ilo->fs); | |||
util_blitter_save_depth_stencil_alpha(ilo->blitter, (void *) ilo->dsa); | |||
util_blitter_save_blend(ilo->blitter, (void *) ilo->blend); | |||
/* undocumented? */ | |||
util_blitter_save_viewport(ilo->blitter, &ilo->viewport.viewport0); | |||
util_blitter_save_stencil_ref(ilo->blitter, &ilo->stencil_ref); | |||
util_blitter_save_sample_mask(ilo->blitter, ilo->sample_mask); | |||
switch (op) { | |||
case ILO_BLITTER_CLEAR: | |||
util_blitter_save_rasterizer(ilo->blitter, (void *) ilo->rasterizer); | |||
break; | |||
case ILO_BLITTER_CLEAR_SURFACE: | |||
util_blitter_save_framebuffer(ilo->blitter, &ilo->fb.state); | |||
break; | |||
case ILO_BLITTER_BLIT: | |||
util_blitter_save_rasterizer(ilo->blitter, (void *) ilo->rasterizer); | |||
util_blitter_save_framebuffer(ilo->blitter, &ilo->fb.state); | |||
util_blitter_save_fragment_sampler_states(ilo->blitter, | |||
ilo->sampler[PIPE_SHADER_FRAGMENT].count, | |||
(void **) ilo->sampler[PIPE_SHADER_FRAGMENT].cso); | |||
util_blitter_save_fragment_sampler_views(ilo->blitter, | |||
ilo->view[PIPE_SHADER_FRAGMENT].count, | |||
ilo->view[PIPE_SHADER_FRAGMENT].states); | |||
/* disable render condition? */ | |||
break; | |||
default: | |||
break; | |||
} | |||
} | |||
static void | |||
ilo_blitter_end(struct ilo_context *ilo) | |||
{ | |||
} | |||
static void | |||
ilo_clear(struct pipe_context *pipe, | |||
unsigned buffers, | |||
@@ -597,14 +540,7 @@ ilo_clear(struct pipe_context *pipe, | |||
{ | |||
struct ilo_context *ilo = ilo_context(pipe); | |||
/* TODO we should pause/resume some queries */ | |||
ilo_blitter_begin(ilo, ILO_BLITTER_CLEAR); | |||
util_blitter_clear(ilo->blitter, | |||
ilo->fb.state.width, ilo->fb.state.height, | |||
buffers, color, depth, stencil); | |||
ilo_blitter_end(ilo); | |||
ilo_blitter_pipe_clear_fb(ilo->blitter, buffers, color, depth, stencil); | |||
} | |||
static void | |||
@@ -634,10 +570,8 @@ ilo_clear_render_target(struct pipe_context *pipe, | |||
packed.ui)) | |||
return; | |||
ilo_blitter_begin(ilo, ILO_BLITTER_CLEAR_SURFACE); | |||
util_blitter_clear_render_target(ilo->blitter, | |||
ilo_blitter_pipe_clear_rt(ilo->blitter, | |||
dst, color, dstx, dsty, width, height); | |||
ilo_blitter_end(ilo); | |||
} | |||
static void | |||
@@ -656,43 +590,17 @@ ilo_clear_depth_stencil(struct pipe_context *pipe, | |||
* not tell us how to program it. Since depth buffers are always Y-tiled, | |||
* HW blit will not work. | |||
*/ | |||
ilo_blitter_begin(ilo, ILO_BLITTER_CLEAR_SURFACE); | |||
util_blitter_clear_depth_stencil(ilo->blitter, | |||
ilo_blitter_pipe_clear_zs(ilo->blitter, | |||
dst, clear_flags, depth, stencil, dstx, dsty, width, height); | |||
ilo_blitter_end(ilo); | |||
} | |||
static void | |||
ilo_blit(struct pipe_context *pipe, const struct pipe_blit_info *info) | |||
{ | |||
struct ilo_context *ilo = ilo_context(pipe); | |||
struct pipe_blit_info skip_stencil; | |||
if (util_try_blit_via_copy_region(pipe, info)) | |||
return; | |||
if (!util_blitter_is_blit_supported(ilo->blitter, info)) { | |||
/* try without stencil */ | |||
if (info->mask & PIPE_MASK_S) { | |||
skip_stencil = *info; | |||
skip_stencil.mask = info->mask & ~PIPE_MASK_S; | |||
if (util_blitter_is_blit_supported(ilo->blitter, &skip_stencil)) | |||
info = &skip_stencil; | |||
} | |||
if (info == &skip_stencil) { | |||
ilo_warn("ignore stencil buffer blitting\n"); | |||
} | |||
else { | |||
ilo_warn("failed to blit with the generic blitter\n"); | |||
return; | |||
} | |||
} | |||
ilo_blitter_begin(ilo, ILO_BLITTER_BLIT); | |||
util_blitter_blit(ilo->blitter, info); | |||
ilo_blitter_end(ilo); | |||
ilo_blitter_pipe_blit(ilo->blitter, info); | |||
} | |||
/** |
@@ -0,0 +1,74 @@ | |||
/* | |||
* Mesa 3-D graphics library | |||
* | |||
* Copyright (C) 2013 LunarG, Inc. | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice shall be included | |||
* in all copies or substantial portions of the Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||
* DEALINGS IN THE SOFTWARE. | |||
* | |||
* Authors: | |||
* Chia-I Wu <olv@lunarg.com> | |||
*/ | |||
#include "util/u_blitter.h" | |||
#include "ilo_context.h" | |||
#include "ilo_blitter.h" | |||
static bool | |||
ilo_blitter_pipe_create(struct ilo_blitter *blitter) | |||
{ | |||
if (blitter->pipe_blitter) | |||
return true; | |||
blitter->pipe_blitter = util_blitter_create(&blitter->ilo->base); | |||
return (blitter->pipe_blitter != NULL); | |||
} | |||
/** | |||
* Create a blitter. Because the use of util_blitter, this must be called | |||
* after the context is initialized. | |||
*/ | |||
struct ilo_blitter * | |||
ilo_blitter_create(struct ilo_context *ilo) | |||
{ | |||
struct ilo_blitter *blitter; | |||
blitter = CALLOC_STRUCT(ilo_blitter); | |||
if (!blitter) | |||
return NULL; | |||
blitter->ilo = ilo; | |||
if (!ilo_blitter_pipe_create(blitter)) { | |||
FREE(blitter); | |||
return NULL; | |||
} | |||
return blitter; | |||
} | |||
void | |||
ilo_blitter_destroy(struct ilo_blitter *blitter) | |||
{ | |||
if (blitter->pipe_blitter) | |||
util_blitter_destroy(blitter->pipe_blitter); | |||
FREE(blitter); | |||
} |
@@ -0,0 +1,80 @@ | |||
/* | |||
* Mesa 3-D graphics library | |||
* | |||
* Copyright (C) 2013 LunarG, Inc. | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice shall be included | |||
* in all copies or substantial portions of the Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||
* DEALINGS IN THE SOFTWARE. | |||
* | |||
* Authors: | |||
* Chia-I Wu <olv@lunarg.com> | |||
*/ | |||
#ifndef ILO_BLITTER_H | |||
#define ILO_BLITTER_H | |||
#include "ilo_common.h" | |||
struct ilo_context; | |||
struct blitter_context; | |||
struct ilo_blitter { | |||
struct ilo_context *ilo; | |||
struct blitter_context *pipe_blitter; | |||
}; | |||
struct ilo_blitter * | |||
ilo_blitter_create(struct ilo_context *ilo); | |||
void | |||
ilo_blitter_destroy(struct ilo_blitter *blitter); | |||
bool | |||
ilo_blitter_pipe_blit(struct ilo_blitter *blitter, | |||
const struct pipe_blit_info *info); | |||
bool | |||
ilo_blitter_pipe_copy_resource(struct ilo_blitter *blitter, | |||
struct pipe_resource *dst, unsigned dst_level, | |||
unsigned dst_x, unsigned dst_y, unsigned dst_z, | |||
struct pipe_resource *src, unsigned src_level, | |||
const struct pipe_box *src_box); | |||
bool | |||
ilo_blitter_pipe_clear_rt(struct ilo_blitter *blitter, | |||
struct pipe_surface *rt, | |||
const union pipe_color_union *color, | |||
unsigned x, unsigned y, | |||
unsigned width, unsigned height); | |||
bool | |||
ilo_blitter_pipe_clear_zs(struct ilo_blitter *blitter, | |||
struct pipe_surface *zs, | |||
unsigned clear_flags, | |||
double depth, unsigned stencil, | |||
unsigned x, unsigned y, | |||
unsigned width, unsigned height); | |||
bool | |||
ilo_blitter_pipe_clear_fb(struct ilo_blitter *blitter, | |||
unsigned buffers, | |||
const union pipe_color_union *color, | |||
double depth, unsigned stencil); | |||
#endif /* ILO_BLITTER_H */ |
@@ -0,0 +1,196 @@ | |||
/* | |||
* Mesa 3-D graphics library | |||
* | |||
* Copyright (C) 2013 LunarG, Inc. | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice shall be included | |||
* in all copies or substantial portions of the Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||
* DEALINGS IN THE SOFTWARE. | |||
* | |||
* Authors: | |||
* Chia-I Wu <olv@lunarg.com> | |||
*/ | |||
#include "util/u_blitter.h" | |||
#include "util/u_surface.h" | |||
#include "ilo_context.h" | |||
#include "ilo_blitter.h" | |||
enum ilo_blitter_pipe_op { | |||
ILO_BLITTER_PIPE_BLIT, | |||
ILO_BLITTER_PIPE_COPY, | |||
ILO_BLITTER_PIPE_CLEAR, | |||
ILO_BLITTER_PIPE_CLEAR_FB, | |||
}; | |||
static void | |||
ilo_blitter_pipe_begin(struct ilo_blitter *blitter, | |||
enum ilo_blitter_pipe_op op) | |||
{ | |||
struct blitter_context *b = blitter->pipe_blitter; | |||
struct ilo_context *ilo = blitter->ilo; | |||
/* as documented in util/u_blitter.h */ | |||
util_blitter_save_vertex_buffer_slot(b, ilo->vb.states); | |||
util_blitter_save_vertex_elements(b, (void *) ilo->ve); | |||
util_blitter_save_vertex_shader(b, ilo->vs); | |||
util_blitter_save_geometry_shader(b, ilo->gs); | |||
util_blitter_save_so_targets(b, ilo->so.count, ilo->so.states); | |||
util_blitter_save_fragment_shader(b, ilo->fs); | |||
util_blitter_save_depth_stencil_alpha(b, (void *) ilo->dsa); | |||
util_blitter_save_blend(b, (void *) ilo->blend); | |||
/* undocumented? */ | |||
util_blitter_save_viewport(b, &ilo->viewport.viewport0); | |||
util_blitter_save_stencil_ref(b, &ilo->stencil_ref); | |||
util_blitter_save_sample_mask(b, ilo->sample_mask); | |||
switch (op) { | |||
case ILO_BLITTER_PIPE_BLIT: | |||
case ILO_BLITTER_PIPE_COPY: | |||
util_blitter_save_rasterizer(b, (void *) ilo->rasterizer); | |||
util_blitter_save_framebuffer(b, &ilo->fb.state); | |||
util_blitter_save_fragment_sampler_states(b, | |||
ilo->sampler[PIPE_SHADER_FRAGMENT].count, | |||
(void **) ilo->sampler[PIPE_SHADER_FRAGMENT].cso); | |||
util_blitter_save_fragment_sampler_views(b, | |||
ilo->view[PIPE_SHADER_FRAGMENT].count, | |||
ilo->view[PIPE_SHADER_FRAGMENT].states); | |||
/* disable render condition? */ | |||
break; | |||
case ILO_BLITTER_PIPE_CLEAR: | |||
util_blitter_save_rasterizer(b, (void *) ilo->rasterizer); | |||
util_blitter_save_framebuffer(b, &ilo->fb.state); | |||
/* disable render condition? */ | |||
break; | |||
case ILO_BLITTER_PIPE_CLEAR_FB: | |||
util_blitter_save_rasterizer(b, (void *) ilo->rasterizer); | |||
break; | |||
default: | |||
break; | |||
} | |||
} | |||
static void | |||
ilo_blitter_pipe_end(struct ilo_blitter *blitter) | |||
{ | |||
} | |||
bool | |||
ilo_blitter_pipe_blit(struct ilo_blitter *blitter, | |||
const struct pipe_blit_info *info) | |||
{ | |||
struct blitter_context *b = blitter->pipe_blitter; | |||
struct pipe_blit_info skip_stencil; | |||
if (util_try_blit_via_copy_region(&blitter->ilo->base, info)) | |||
return true; | |||
if (!util_blitter_is_blit_supported(b, info)) { | |||
/* try without stencil */ | |||
if (info->mask & PIPE_MASK_S) { | |||
skip_stencil = *info; | |||
skip_stencil.mask = info->mask & ~PIPE_MASK_S; | |||
if (util_blitter_is_blit_supported(blitter->pipe_blitter, | |||
&skip_stencil)) { | |||
ilo_warn("ignore stencil buffer blitting\n"); | |||
info = &skip_stencil; | |||
} | |||
} | |||
if (info != &skip_stencil) { | |||
ilo_warn("failed to blit with pipe blitter\n"); | |||
return false; | |||
} | |||
} | |||
ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_BLIT); | |||
util_blitter_blit(b, info); | |||
ilo_blitter_pipe_end(blitter); | |||
return true; | |||
} | |||
bool | |||
ilo_blitter_pipe_copy_resource(struct ilo_blitter *blitter, | |||
struct pipe_resource *dst, unsigned dst_level, | |||
unsigned dst_x, unsigned dst_y, unsigned dst_z, | |||
struct pipe_resource *src, unsigned src_level, | |||
const struct pipe_box *src_box) | |||
{ | |||
return false; | |||
} | |||
bool | |||
ilo_blitter_pipe_clear_rt(struct ilo_blitter *blitter, | |||
struct pipe_surface *rt, | |||
const union pipe_color_union *color, | |||
unsigned x, unsigned y, | |||
unsigned width, unsigned height) | |||
{ | |||
ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_CLEAR); | |||
util_blitter_clear_render_target(blitter->pipe_blitter, | |||
rt, color, x, y, width, height); | |||
ilo_blitter_pipe_end(blitter); | |||
return true; | |||
} | |||
bool | |||
ilo_blitter_pipe_clear_zs(struct ilo_blitter *blitter, | |||
struct pipe_surface *zs, | |||
unsigned clear_flags, | |||
double depth, unsigned stencil, | |||
unsigned x, unsigned y, | |||
unsigned width, unsigned height) | |||
{ | |||
ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_CLEAR); | |||
util_blitter_clear_depth_stencil(blitter->pipe_blitter, | |||
zs, clear_flags, depth, stencil, x, y, width, height); | |||
ilo_blitter_pipe_end(blitter); | |||
return true; | |||
} | |||
bool | |||
ilo_blitter_pipe_clear_fb(struct ilo_blitter *blitter, | |||
unsigned buffers, | |||
const union pipe_color_union *color, | |||
double depth, unsigned stencil) | |||
{ | |||
/* TODO we should pause/resume some queries */ | |||
ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_CLEAR_FB); | |||
util_blitter_clear(blitter->pipe_blitter, | |||
blitter->ilo->fb.state.width, blitter->ilo->fb.state.height, | |||
buffers, color, depth, stencil); | |||
ilo_blitter_pipe_end(blitter); | |||
return true; | |||
} |
@@ -25,11 +25,11 @@ | |||
* Chia-I Wu <olv@lunarg.com> | |||
*/ | |||
#include "util/u_blitter.h" | |||
#include "intel_chipset.h" | |||
#include "ilo_3d.h" | |||
#include "ilo_blit.h" | |||
#include "ilo_blitter.h" | |||
#include "ilo_cp.h" | |||
#include "ilo_gpgpu.h" | |||
#include "ilo_query.h" | |||
@@ -99,7 +99,7 @@ ilo_context_destroy(struct pipe_context *pipe) | |||
util_slab_destroy(&ilo->transfer_mempool); | |||
if (ilo->blitter) | |||
util_blitter_destroy(ilo->blitter); | |||
ilo_blitter_destroy(ilo->blitter); | |||
if (ilo->hw3d) | |||
ilo_3d_destroy(ilo->hw3d); | |||
if (ilo->shader_cache) | |||
@@ -156,7 +156,7 @@ ilo_context_create(struct pipe_screen *screen, void *priv) | |||
ilo_init_states(ilo); | |||
/* this must be called last as u_blitter is a client of the pipe context */ | |||
ilo->blitter = util_blitter_create(&ilo->base); | |||
ilo->blitter = ilo_blitter_create(ilo); | |||
if (!ilo->blitter) { | |||
ilo_context_destroy(&ilo->base); | |||
return NULL; |
@@ -34,10 +34,10 @@ | |||
#include "ilo_gpe.h" | |||
#include "ilo_common.h" | |||
struct blitter_context; | |||
struct intel_winsys; | |||
struct intel_bo; | |||
struct ilo_3d; | |||
struct ilo_blitter; | |||
struct ilo_cp; | |||
struct ilo_screen; | |||
struct ilo_shader_state; | |||
@@ -55,7 +55,7 @@ struct ilo_context { | |||
struct ilo_shader_cache *shader_cache; | |||
struct ilo_3d *hw3d; | |||
struct blitter_context *blitter; | |||
struct ilo_blitter *blitter; | |||
uint32_t dirty; | |||