On Thu, Aug 4, 2016 at 7:56 PM, Marek Olšák <[email protected]> wrote: > From: Marek Olšák <[email protected]> > > Some ideas copied from Jakob Sinclair's implementation, but the color > clearing is completely different. > --- > docs/GL3.txt | 2 +- > docs/relnotes/12.1.0.html | 1 + > src/gallium/drivers/r600/r600_pipe.c | 2 +- > src/gallium/drivers/radeon/r600_texture.c | 69 > +++++++++++++++++++++++++++++++ > src/gallium/drivers/radeonsi/si_pipe.c | 2 +- > 5 files changed, 73 insertions(+), 3 deletions(-) > > diff --git a/docs/GL3.txt b/docs/GL3.txt > index c185c69..5dcfc31 100644 > --- a/docs/GL3.txt > +++ b/docs/GL3.txt > @@ -185,21 +185,21 @@ GL 4.3, GLSL 4.30 -- all DONE: nvc0, radeonsi > GL_ARB_texture_query_levels DONE (all drivers > that support GLSL 1.30) > GL_ARB_texture_storage_multisample DONE (all drivers > that support GL_ARB_texture_multisample) > GL_ARB_texture_view DONE (i965, nv50, > r600, llvmpipe, softpipe, swr) > GL_ARB_vertex_attrib_binding DONE (all drivers) > > > GL 4.4, GLSL 4.40: > > GL_MAX_VERTEX_ATTRIB_STRIDE DONE (all drivers) > GL_ARB_buffer_storage DONE (i965, nv50, > nvc0, r600, radeonsi) > - GL_ARB_clear_texture DONE (i965, nv50, > nvc0) > + GL_ARB_clear_texture DONE (i965, nv50, > nvc0, r600, radeonsi) > GL_ARB_enhanced_layouts DONE (i965) > - compile-time constant expressions DONE > - explicit byte offsets for blocks DONE > - forced alignment within blocks DONE > - specified vec4-slot component numbers DONE (i965) > - specified transform/feedback layout DONE > - input/output block locations DONE > GL_ARB_multi_bind DONE (all drivers) > GL_ARB_query_buffer_object DONE (i965/hsw+, > nvc0) > GL_ARB_texture_mirror_clamp_to_edge DONE (i965, nv50, > nvc0, r600, radeonsi, llvmpipe, softpipe, swr) > diff --git a/docs/relnotes/12.1.0.html b/docs/relnotes/12.1.0.html > index 3935bb0..ed98d13 100644 > --- a/docs/relnotes/12.1.0.html > +++ b/docs/relnotes/12.1.0.html > @@ -37,20 +37,21 @@ TBD. > </pre> > > > <h2>New features</h2> > > <p> > Note: some of the new features are only available with certain drivers. > </p> > > <ul> > +<li>GL_ARB_clear_texture on r600, radeonsi</li> > <li>GL_ARB_enhanced_layouts on i965</li> > <li>GL_ARB_shader_group_vote on nvc0</li> > <li>GL_ARB_ES3_1_compatibility on i965</li> > <li>GL_EXT_window_rectangles on nv50, nvc0</li> > <li>GL_KHR_texture_compression_astc_sliced_3d on i965</li> > </ul> > > <h2>Bug fixes</h2> > > TBD. > diff --git a/src/gallium/drivers/r600/r600_pipe.c > b/src/gallium/drivers/r600/r600_pipe.c > index 39a310a..5f69a5d 100644 > --- a/src/gallium/drivers/r600/r600_pipe.c > +++ b/src/gallium/drivers/r600/r600_pipe.c > @@ -276,20 +276,21 @@ static int r600_get_param(struct pipe_screen* pscreen, > enum pipe_cap param) > case PIPE_CAP_CONDITIONAL_RENDER_INVERTED: > case PIPE_CAP_TEXTURE_FLOAT_LINEAR: > case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR: > case PIPE_CAP_TGSI_TXQS: > case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS: > case PIPE_CAP_INVALIDATE_BUFFER: > case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS: > case PIPE_CAP_QUERY_MEMORY_INFO: > case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT: > case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED: > + case PIPE_CAP_CLEAR_TEXTURE: > return 1; > > case PIPE_CAP_DEVICE_RESET_STATUS_QUERY: > return rscreen->b.info.drm_major == 2 && > rscreen->b.info.drm_minor >= 43; > > case PIPE_CAP_RESOURCE_FROM_USER_MEMORY: > return !R600_BIG_ENDIAN && rscreen->b.info.has_userptr; > > case PIPE_CAP_COMPUTE: > return rscreen->b.chip_class > R700; > @@ -348,21 +349,20 @@ static int r600_get_param(struct pipe_screen* pscreen, > enum pipe_cap param) > case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER: > case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS: > case PIPE_CAP_FRAGMENT_COLOR_CLAMPED: > case PIPE_CAP_VERTEX_COLOR_CLAMPED: > case PIPE_CAP_USER_VERTEX_BUFFERS: > case PIPE_CAP_TEXTURE_GATHER_OFFSETS: > case PIPE_CAP_VERTEXID_NOBASE: > case PIPE_CAP_DEPTH_BOUNDS_TEST: > case PIPE_CAP_FORCE_PERSAMPLE_INTERP: > case PIPE_CAP_SHAREABLE_SHADERS: > - case PIPE_CAP_CLEAR_TEXTURE: > case PIPE_CAP_DRAW_PARAMETERS: > case PIPE_CAP_TGSI_PACK_HALF_FLOAT: > case PIPE_CAP_MULTI_DRAW_INDIRECT: > case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS: > case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL: > case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL: > case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT: > case PIPE_CAP_GENERATE_MIPMAP: > case PIPE_CAP_STRING_MARKER: > case PIPE_CAP_QUERY_BUFFER_OBJECT: > diff --git a/src/gallium/drivers/radeon/r600_texture.c > b/src/gallium/drivers/radeon/r600_texture.c > index f7c2f80..65b40ce 100644 > --- a/src/gallium/drivers/radeon/r600_texture.c > +++ b/src/gallium/drivers/radeon/r600_texture.c > @@ -23,20 +23,21 @@ > * Authors: > * Jerome Glisse > * Corbin Simpson > */ > #include "r600_pipe_common.h" > #include "r600_cs.h" > #include "r600_query.h" > #include "util/u_format.h" > #include "util/u_memory.h" > #include "util/u_pack_color.h" > +#include "util/u_surface.h" > #include "os/os_time.h" > #include <errno.h> > #include <inttypes.h> > > static void r600_texture_discard_cmask(struct r600_common_screen *rscreen, > struct r600_texture *rtex); > static unsigned r600_choose_tiling(struct r600_common_screen *rscreen, > const struct pipe_resource *templ); > > > @@ -1689,20 +1690,87 @@ static struct pipe_surface > *r600_create_surface(struct pipe_context *pipe, > static void r600_surface_destroy(struct pipe_context *pipe, > struct pipe_surface *surface) > { > struct r600_surface *surf = (struct r600_surface*)surface; > r600_resource_reference(&surf->cb_buffer_fmask, NULL); > r600_resource_reference(&surf->cb_buffer_cmask, NULL); > pipe_resource_reference(&surface->texture, NULL); > FREE(surface); > } > > +static void r600_clear_texture(struct pipe_context *pipe, > + struct pipe_resource *tex, > + unsigned level, > + const struct pipe_box *box, > + const void *data) > +{ > + struct pipe_screen *screen = pipe->screen; > + struct r600_texture *rtex = (struct r600_texture*)tex; > + struct pipe_surface tmpl = {{0}}, *sf; > + const struct util_format_description *desc = > + util_format_description(tex->format); > + > + tmpl.format = tex->format; > + tmpl.u.tex.first_layer = box->z; > + tmpl.u.tex.last_layer = box->z + box->depth - 1; > + tmpl.u.tex.level = level; > + sf = pipe->create_surface(pipe, tex, &tmpl); > + if (!sf) > + return; > + > + if (rtex->is_depth) { > + unsigned clear; > + float depth; > + uint8_t stencil = 0; > + > + /* Depth is always present. */ > + clear = PIPE_CLEAR_DEPTH; > + desc->unpack_z_float(&depth, 0, data, 0, 1, 1); > + > + if (rtex->surface.flags & RADEON_SURF_SBUFFER) { > + clear |= PIPE_CLEAR_STENCIL; > + desc->unpack_s_8uint(&stencil, 0, data, 0, 1, 1); > + } > + > + pipe->clear_depth_stencil(pipe, sf, clear, depth, stencil, > + box->x, box->y, > + box->width, box->height); > + } else { > + union pipe_color_union color; > + > + assert(rtex->surface.bpe <= sizeof(color)); > + memcpy(&color, data, rtex->surface.bpe);
The 2 lines above are leftovers. I'm removing them. Marek _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
