diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4212-drm-amd-display-Move-DCC-support-functions-into-dchu.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/4212-drm-amd-display-Move-DCC-support-functions-into-dchu.patch | 606 |
1 files changed, 606 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4212-drm-amd-display-Move-DCC-support-functions-into-dchu.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4212-drm-amd-display-Move-DCC-support-functions-into-dchu.patch new file mode 100644 index 00000000..e6e9ca81 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4212-drm-amd-display-Move-DCC-support-functions-into-dchu.patch @@ -0,0 +1,606 @@ +From 387e89d496d8c3e225642ce5beb744d95cb321ef Mon Sep 17 00:00:00 2001 +From: Eric Bernstein <eric.bernstein@amd.com> +Date: Thu, 5 Apr 2018 17:09:20 -0400 +Subject: [PATCH 4212/5725] drm/amd/display: Move DCC support functions into + dchubbub + +Added dchububu.h header file for common enum/struct definitions. +Added new interface functions get_dcc_compression_cap, +dcc_support_swizzle, dcc_support_pixel_format. + +Signed-off-by: Eric Bernstein <eric.bernstein@amd.com> +Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> +--- + .../gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c | 221 +++++++++++++++++++- + .../gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h | 7 +- + .../gpu/drm/amd/display/dc/dcn10/dcn10_resource.c | 231 +-------------------- + drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h | 64 ++++++ + 4 files changed, 291 insertions(+), 232 deletions(-) + create mode 100644 drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c +index 738f67f..b9fb14a 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c +@@ -476,8 +476,227 @@ void hubbub1_toggle_watermark_change_req(struct hubbub *hubbub) + DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, watermark_change_req); + } + ++static bool hubbub1_dcc_support_swizzle( ++ enum swizzle_mode_values swizzle, ++ unsigned int bytes_per_element, ++ enum segment_order *segment_order_horz, ++ enum segment_order *segment_order_vert) ++{ ++ bool standard_swizzle = false; ++ bool display_swizzle = false; ++ ++ switch (swizzle) { ++ case DC_SW_4KB_S: ++ case DC_SW_64KB_S: ++ case DC_SW_VAR_S: ++ case DC_SW_4KB_S_X: ++ case DC_SW_64KB_S_X: ++ case DC_SW_VAR_S_X: ++ standard_swizzle = true; ++ break; ++ case DC_SW_4KB_D: ++ case DC_SW_64KB_D: ++ case DC_SW_VAR_D: ++ case DC_SW_4KB_D_X: ++ case DC_SW_64KB_D_X: ++ case DC_SW_VAR_D_X: ++ display_swizzle = true; ++ break; ++ default: ++ break; ++ } ++ ++ if (bytes_per_element == 1 && standard_swizzle) { ++ *segment_order_horz = segment_order__contiguous; ++ *segment_order_vert = segment_order__na; ++ return true; ++ } ++ if (bytes_per_element == 2 && standard_swizzle) { ++ *segment_order_horz = segment_order__non_contiguous; ++ *segment_order_vert = segment_order__contiguous; ++ return true; ++ } ++ if (bytes_per_element == 4 && standard_swizzle) { ++ *segment_order_horz = segment_order__non_contiguous; ++ *segment_order_vert = segment_order__contiguous; ++ return true; ++ } ++ if (bytes_per_element == 8 && standard_swizzle) { ++ *segment_order_horz = segment_order__na; ++ *segment_order_vert = segment_order__contiguous; ++ return true; ++ } ++ if (bytes_per_element == 8 && display_swizzle) { ++ *segment_order_horz = segment_order__contiguous; ++ *segment_order_vert = segment_order__non_contiguous; ++ return true; ++ } ++ ++ return false; ++} ++ ++static bool hubbub1_dcc_support_pixel_format( ++ enum surface_pixel_format format, ++ unsigned int *bytes_per_element) ++{ ++ /* DML: get_bytes_per_element */ ++ switch (format) { ++ case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555: ++ case SURFACE_PIXEL_FORMAT_GRPH_RGB565: ++ *bytes_per_element = 2; ++ return true; ++ case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888: ++ case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888: ++ case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010: ++ case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010: ++ *bytes_per_element = 4; ++ return true; ++ case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: ++ case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: ++ case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: ++ *bytes_per_element = 8; ++ return true; ++ default: ++ return false; ++ } ++} ++ ++static void hubbub1_get_blk256_size(unsigned int *blk256_width, unsigned int *blk256_height, ++ unsigned int bytes_per_element) ++{ ++ /* copied from DML. might want to refactor DML to leverage from DML */ ++ /* DML : get_blk256_size */ ++ if (bytes_per_element == 1) { ++ *blk256_width = 16; ++ *blk256_height = 16; ++ } else if (bytes_per_element == 2) { ++ *blk256_width = 16; ++ *blk256_height = 8; ++ } else if (bytes_per_element == 4) { ++ *blk256_width = 8; ++ *blk256_height = 8; ++ } else if (bytes_per_element == 8) { ++ *blk256_width = 8; ++ *blk256_height = 4; ++ } ++} ++ ++static void hubbub1_det_request_size( ++ unsigned int height, ++ unsigned int width, ++ unsigned int bpe, ++ bool *req128_horz_wc, ++ bool *req128_vert_wc) ++{ ++ unsigned int detile_buf_size = 164 * 1024; /* 164KB for DCN1.0 */ ++ ++ unsigned int blk256_height = 0; ++ unsigned int blk256_width = 0; ++ unsigned int swath_bytes_horz_wc, swath_bytes_vert_wc; ++ ++ hubbub1_get_blk256_size(&blk256_width, &blk256_height, bpe); ++ ++ swath_bytes_horz_wc = height * blk256_height * bpe; ++ swath_bytes_vert_wc = width * blk256_width * bpe; ++ ++ *req128_horz_wc = (2 * swath_bytes_horz_wc <= detile_buf_size) ? ++ false : /* full 256B request */ ++ true; /* half 128b request */ ++ ++ *req128_vert_wc = (2 * swath_bytes_vert_wc <= detile_buf_size) ? ++ false : /* full 256B request */ ++ true; /* half 128b request */ ++} ++ ++static bool hubbub1_get_dcc_compression_cap(struct hubbub *hubbub, ++ const struct dc_dcc_surface_param *input, ++ struct dc_surface_dcc_cap *output) ++{ ++ struct dc *dc = hubbub->ctx->dc; ++ /* implement section 1.6.2.1 of DCN1_Programming_Guide.docx */ ++ enum dcc_control dcc_control; ++ unsigned int bpe; ++ enum segment_order segment_order_horz, segment_order_vert; ++ bool req128_horz_wc, req128_vert_wc; ++ ++ memset(output, 0, sizeof(*output)); ++ ++ if (dc->debug.disable_dcc == DCC_DISABLE) ++ return false; ++ ++ if (!hubbub->funcs->dcc_support_pixel_format(input->format, &bpe)) ++ return false; ++ ++ if (!hubbub->funcs->dcc_support_swizzle(input->swizzle_mode, bpe, ++ &segment_order_horz, &segment_order_vert)) ++ return false; ++ ++ hubbub1_det_request_size(input->surface_size.height, input->surface_size.width, ++ bpe, &req128_horz_wc, &req128_vert_wc); ++ ++ if (!req128_horz_wc && !req128_vert_wc) { ++ dcc_control = dcc_control__256_256_xxx; ++ } else if (input->scan == SCAN_DIRECTION_HORIZONTAL) { ++ if (!req128_horz_wc) ++ dcc_control = dcc_control__256_256_xxx; ++ else if (segment_order_horz == segment_order__contiguous) ++ dcc_control = dcc_control__128_128_xxx; ++ else ++ dcc_control = dcc_control__256_64_64; ++ } else if (input->scan == SCAN_DIRECTION_VERTICAL) { ++ if (!req128_vert_wc) ++ dcc_control = dcc_control__256_256_xxx; ++ else if (segment_order_vert == segment_order__contiguous) ++ dcc_control = dcc_control__128_128_xxx; ++ else ++ dcc_control = dcc_control__256_64_64; ++ } else { ++ if ((req128_horz_wc && ++ segment_order_horz == segment_order__non_contiguous) || ++ (req128_vert_wc && ++ segment_order_vert == segment_order__non_contiguous)) ++ /* access_dir not known, must use most constraining */ ++ dcc_control = dcc_control__256_64_64; ++ else ++ /* reg128 is true for either horz and vert ++ * but segment_order is contiguous ++ */ ++ dcc_control = dcc_control__128_128_xxx; ++ } ++ ++ if (dc->debug.disable_dcc == DCC_HALF_REQ_DISALBE && ++ dcc_control != dcc_control__256_256_xxx) ++ return false; ++ ++ switch (dcc_control) { ++ case dcc_control__256_256_xxx: ++ output->grph.rgb.max_uncompressed_blk_size = 256; ++ output->grph.rgb.max_compressed_blk_size = 256; ++ output->grph.rgb.independent_64b_blks = false; ++ break; ++ case dcc_control__128_128_xxx: ++ output->grph.rgb.max_uncompressed_blk_size = 128; ++ output->grph.rgb.max_compressed_blk_size = 128; ++ output->grph.rgb.independent_64b_blks = false; ++ break; ++ case dcc_control__256_64_64: ++ output->grph.rgb.max_uncompressed_blk_size = 256; ++ output->grph.rgb.max_compressed_blk_size = 64; ++ output->grph.rgb.independent_64b_blks = true; ++ break; ++ } ++ ++ output->capable = true; ++ output->const_color_support = false; ++ ++ return true; ++} ++ + static const struct hubbub_funcs hubbub1_funcs = { +- .update_dchub = hubbub1_update_dchub ++ .update_dchub = hubbub1_update_dchub, ++ .dcc_support_swizzle = hubbub1_dcc_support_swizzle, ++ .dcc_support_pixel_format = hubbub1_dcc_support_pixel_format, ++ .get_dcc_compression_cap = hubbub1_get_dcc_compression_cap, + }; + + void hubbub1_construct(struct hubbub *hubbub, +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h +index a16e908..f479f54 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h +@@ -27,6 +27,7 @@ + #define __DC_HUBBUB_DCN10_H__ + + #include "core_types.h" ++#include "dchubbub.h" + + #define HUBHUB_REG_LIST_DCN()\ + SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A),\ +@@ -173,12 +174,6 @@ struct dcn_hubbub_wm { + struct dcn_hubbub_wm_set sets[4]; + }; + +-struct hubbub_funcs { +- void (*update_dchub)( +- struct hubbub *hubbub, +- struct dchub_init_data *dh_data); +-}; +- + struct hubbub { + const struct hubbub_funcs *funcs; + struct dc_context *ctx; +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c +index f305f65..2c0a315 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c +@@ -937,235 +937,16 @@ static struct pipe_ctx *dcn10_acquire_idle_pipe_for_layer( + return idle_pipe; + } + +-enum dcc_control { +- dcc_control__256_256_xxx, +- dcc_control__128_128_xxx, +- dcc_control__256_64_64, +-}; +- +-enum segment_order { +- segment_order__na, +- segment_order__contiguous, +- segment_order__non_contiguous, +-}; +- +-static bool dcc_support_pixel_format( +- enum surface_pixel_format format, +- unsigned int *bytes_per_element) +-{ +- /* DML: get_bytes_per_element */ +- switch (format) { +- case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555: +- case SURFACE_PIXEL_FORMAT_GRPH_RGB565: +- *bytes_per_element = 2; +- return true; +- case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888: +- case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888: +- case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010: +- case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010: +- *bytes_per_element = 4; +- return true; +- case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: +- case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: +- case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: +- *bytes_per_element = 8; +- return true; +- default: +- return false; +- } +-} +- +-static bool dcc_support_swizzle( +- enum swizzle_mode_values swizzle, +- unsigned int bytes_per_element, +- enum segment_order *segment_order_horz, +- enum segment_order *segment_order_vert) +-{ +- bool standard_swizzle = false; +- bool display_swizzle = false; +- +- switch (swizzle) { +- case DC_SW_4KB_S: +- case DC_SW_64KB_S: +- case DC_SW_VAR_S: +- case DC_SW_4KB_S_X: +- case DC_SW_64KB_S_X: +- case DC_SW_VAR_S_X: +- standard_swizzle = true; +- break; +- case DC_SW_4KB_D: +- case DC_SW_64KB_D: +- case DC_SW_VAR_D: +- case DC_SW_4KB_D_X: +- case DC_SW_64KB_D_X: +- case DC_SW_VAR_D_X: +- display_swizzle = true; +- break; +- default: +- break; +- } +- +- if (bytes_per_element == 1 && standard_swizzle) { +- *segment_order_horz = segment_order__contiguous; +- *segment_order_vert = segment_order__na; +- return true; +- } +- if (bytes_per_element == 2 && standard_swizzle) { +- *segment_order_horz = segment_order__non_contiguous; +- *segment_order_vert = segment_order__contiguous; +- return true; +- } +- if (bytes_per_element == 4 && standard_swizzle) { +- *segment_order_horz = segment_order__non_contiguous; +- *segment_order_vert = segment_order__contiguous; +- return true; +- } +- if (bytes_per_element == 8 && standard_swizzle) { +- *segment_order_horz = segment_order__na; +- *segment_order_vert = segment_order__contiguous; +- return true; +- } +- if (bytes_per_element == 8 && display_swizzle) { +- *segment_order_horz = segment_order__contiguous; +- *segment_order_vert = segment_order__non_contiguous; +- return true; +- } +- +- return false; +-} +- +-static void get_blk256_size(unsigned int *blk256_width, unsigned int *blk256_height, +- unsigned int bytes_per_element) +-{ +- /* copied from DML. might want to refactor DML to leverage from DML */ +- /* DML : get_blk256_size */ +- if (bytes_per_element == 1) { +- *blk256_width = 16; +- *blk256_height = 16; +- } else if (bytes_per_element == 2) { +- *blk256_width = 16; +- *blk256_height = 8; +- } else if (bytes_per_element == 4) { +- *blk256_width = 8; +- *blk256_height = 8; +- } else if (bytes_per_element == 8) { +- *blk256_width = 8; +- *blk256_height = 4; +- } +-} +- +-static void det_request_size( +- unsigned int height, +- unsigned int width, +- unsigned int bpe, +- bool *req128_horz_wc, +- bool *req128_vert_wc) +-{ +- unsigned int detile_buf_size = 164 * 1024; /* 164KB for DCN1.0 */ +- +- unsigned int blk256_height = 0; +- unsigned int blk256_width = 0; +- unsigned int swath_bytes_horz_wc, swath_bytes_vert_wc; +- +- get_blk256_size(&blk256_width, &blk256_height, bpe); +- +- swath_bytes_horz_wc = height * blk256_height * bpe; +- swath_bytes_vert_wc = width * blk256_width * bpe; +- +- *req128_horz_wc = (2 * swath_bytes_horz_wc <= detile_buf_size) ? +- false : /* full 256B request */ +- true; /* half 128b request */ +- +- *req128_vert_wc = (2 * swath_bytes_vert_wc <= detile_buf_size) ? +- false : /* full 256B request */ +- true; /* half 128b request */ +-} +- +-static bool get_dcc_compression_cap(const struct dc *dc, ++static bool dcn10_get_dcc_compression_cap(const struct dc *dc, + const struct dc_dcc_surface_param *input, + struct dc_surface_dcc_cap *output) + { +- /* implement section 1.6.2.1 of DCN1_Programming_Guide.docx */ +- enum dcc_control dcc_control; +- unsigned int bpe; +- enum segment_order segment_order_horz, segment_order_vert; +- bool req128_horz_wc, req128_vert_wc; +- +- memset(output, 0, sizeof(*output)); +- +- if (dc->debug.disable_dcc == DCC_DISABLE) +- return false; +- +- if (!dcc_support_pixel_format(input->format, +- &bpe)) +- return false; +- +- if (!dcc_support_swizzle(input->swizzle_mode, bpe, +- &segment_order_horz, &segment_order_vert)) +- return false; +- +- det_request_size(input->surface_size.height, input->surface_size.width, +- bpe, &req128_horz_wc, &req128_vert_wc); +- +- if (!req128_horz_wc && !req128_vert_wc) { +- dcc_control = dcc_control__256_256_xxx; +- } else if (input->scan == SCAN_DIRECTION_HORIZONTAL) { +- if (!req128_horz_wc) +- dcc_control = dcc_control__256_256_xxx; +- else if (segment_order_horz == segment_order__contiguous) +- dcc_control = dcc_control__128_128_xxx; +- else +- dcc_control = dcc_control__256_64_64; +- } else if (input->scan == SCAN_DIRECTION_VERTICAL) { +- if (!req128_vert_wc) +- dcc_control = dcc_control__256_256_xxx; +- else if (segment_order_vert == segment_order__contiguous) +- dcc_control = dcc_control__128_128_xxx; +- else +- dcc_control = dcc_control__256_64_64; +- } else { +- if ((req128_horz_wc && +- segment_order_horz == segment_order__non_contiguous) || +- (req128_vert_wc && +- segment_order_vert == segment_order__non_contiguous)) +- /* access_dir not known, must use most constraining */ +- dcc_control = dcc_control__256_64_64; +- else +- /* reg128 is true for either horz and vert +- * but segment_order is contiguous +- */ +- dcc_control = dcc_control__128_128_xxx; +- } +- +- if (dc->debug.disable_dcc == DCC_HALF_REQ_DISALBE && +- dcc_control != dcc_control__256_256_xxx) +- return false; +- +- switch (dcc_control) { +- case dcc_control__256_256_xxx: +- output->grph.rgb.max_uncompressed_blk_size = 256; +- output->grph.rgb.max_compressed_blk_size = 256; +- output->grph.rgb.independent_64b_blks = false; +- break; +- case dcc_control__128_128_xxx: +- output->grph.rgb.max_uncompressed_blk_size = 128; +- output->grph.rgb.max_compressed_blk_size = 128; +- output->grph.rgb.independent_64b_blks = false; +- break; +- case dcc_control__256_64_64: +- output->grph.rgb.max_uncompressed_blk_size = 256; +- output->grph.rgb.max_compressed_blk_size = 64; +- output->grph.rgb.independent_64b_blks = true; +- break; +- } +- +- output->capable = true; +- output->const_color_support = false; +- +- return true; ++ return dc->res_pool->hubbub->funcs->get_dcc_compression_cap( ++ dc->res_pool->hubbub, ++ input, ++ output); + } + +- + static void dcn10_destroy_resource_pool(struct resource_pool **pool) + { + struct dcn10_resource_pool *dcn10_pool = TO_DCN10_RES_POOL(*pool); +@@ -1186,7 +967,7 @@ static enum dc_status dcn10_validate_plane(const struct dc_plane_state *plane_st + } + + static struct dc_cap_funcs cap_funcs = { +- .get_dcc_compression_cap = get_dcc_compression_cap ++ .get_dcc_compression_cap = dcn10_get_dcc_compression_cap + }; + + static struct resource_funcs dcn10_res_pool_funcs = { +diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h +new file mode 100644 +index 0000000..02f757d +--- /dev/null ++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h +@@ -0,0 +1,64 @@ ++/* ++ * Copyright 2012-15 Advanced Micro Devices, 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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: AMD ++ * ++ */ ++ ++#ifndef __DAL_DCHUBBUB_H__ ++#define __DAL_DCHUBBUB_H__ ++ ++ ++enum dcc_control { ++ dcc_control__256_256_xxx, ++ dcc_control__128_128_xxx, ++ dcc_control__256_64_64, ++}; ++ ++enum segment_order { ++ segment_order__na, ++ segment_order__contiguous, ++ segment_order__non_contiguous, ++}; ++ ++ ++struct hubbub_funcs { ++ void (*update_dchub)( ++ struct hubbub *hubbub, ++ struct dchub_init_data *dh_data); ++ ++ bool (*get_dcc_compression_cap)(struct hubbub *hubbub, ++ const struct dc_dcc_surface_param *input, ++ struct dc_surface_dcc_cap *output); ++ ++ bool (*dcc_support_swizzle)( ++ enum swizzle_mode_values swizzle, ++ unsigned int bytes_per_element, ++ enum segment_order *segment_order_horz, ++ enum segment_order *segment_order_vert); ++ ++ bool (*dcc_support_pixel_format)( ++ enum surface_pixel_format format, ++ unsigned int *bytes_per_element); ++}; ++ ++ ++#endif +-- +2.7.4 + |