From c0fdee5787dab3be3ee1acf82d4c0372d3e78089 Mon Sep 17 00:00:00 2001 From: Krishna Yalamarthy Date: Sun, 21 Mar 2021 22:55:24 -0400 Subject: [PATCH] bilinear sampling --- hw/rtl/tex_unit/VX_bilerp.v | 71 ++++++++++++++++++ hw/rtl/tex_unit/VX_lerp.v | 18 +++++ hw/rtl/tex_unit/VX_tex_define.vh | 5 +- hw/rtl/tex_unit/VX_tex_format.v | 122 +++++++++++++++++++++---------- hw/rtl/tex_unit/VX_tex_sampler.v | 80 +++++++++++++------- 5 files changed, 229 insertions(+), 67 deletions(-) create mode 100644 hw/rtl/tex_unit/VX_bilerp.v create mode 100644 hw/rtl/tex_unit/VX_lerp.v diff --git a/hw/rtl/tex_unit/VX_bilerp.v b/hw/rtl/tex_unit/VX_bilerp.v new file mode 100644 index 00000000..5493bd9a --- /dev/null +++ b/hw/rtl/tex_unit/VX_bilerp.v @@ -0,0 +1,71 @@ +`include "VX_tex_define.vh" + +module VX_bilerp #( + parameter CORE_ID = 0 +) ( + input wire [`BLEND_FRAC_64-1:0] blendU, //blendU + input wire [`BLEND_FRAC_64-1:0] blendV, //blendV + + input wire [3:0][63:0] texels, + input wire [`TEX_FORMAT_BITS-1:0] color_enable, + + output wire [31:0] sampled_data +); + `UNUSED_PARAM (CORE_ID) + `UNUSED_VAR(color_enable) + + wire [63:0] UL_lerp; + wire [63:0] UH_lerp; + wire [63:0] V_lerp; + reg [31:0] sampled_r; + + VX_lerp_64 #( + ) UL_lerp ( + .blend(blendU), + .in_texels({texels[1], texels[0]}), + + .lerp_texel(UL_lerp) + ); + + VX_lerp_64 #( + ) UH_lerp ( + .blend(blendU), + .in_texels({texels[3], texels[2]}), + + .lerp_texel(UH_lerp) + ); + + VX_lerp_64 #( + ) V_lerp ( + .blend(blendV), + .in_texels({UH_lerp, UL_lerp}), + + .lerp_texel(V_lerp) + ); + + always @(*) begin + if(color_enable[3]==1) //R + sampled_r[31:24] = V_lerp[55:48]; + else + sampled_r[31:24] = {`TEX_COLOR_BITS{1'b0}}; + + if(color_enable[2]==1) //G + sampled_r[23:16] = V_lerp[39:32]; + else + sampled_r[23:16] = {`TEX_COLOR_BITS{1'b0}}; + + if(color_enable[1]==1) //B + sampled_r[15:8] = V_lerp[23:16]; + else + sampled_r[15:8] = {`TEX_COLOR_BITS{1'b0}}; + + if(color_enable[0]==1) //A + sampled_r[7:0] = V_lerp[7:0]; + else + sampled_r[7:0] = {`TEX_COLOR_BITS{1'b1}}; + end + + + assign sampled_data = sampled_r; + +endmodule \ No newline at end of file diff --git a/hw/rtl/tex_unit/VX_lerp.v b/hw/rtl/tex_unit/VX_lerp.v new file mode 100644 index 00000000..40e0baf8 --- /dev/null +++ b/hw/rtl/tex_unit/VX_lerp.v @@ -0,0 +1,18 @@ +`include "VX_tex_define.vh" + +module VX_lerp_64 #( +) ( + input wire [`BLEND_FRAC_64-1:0] blend, + input wire [1:0][63:0] in_texels, + + output wire [63:0] lerp_texel +); + + wire [63:0] lerp_i1; + wire [63:0] lerp_i2; // >> BLEND_FRAC_64 / >> 8 + + assign lerp_i1 = (in_texels[0] - in_texels[1]) * blend; + assign lerp_i2 = in_texels[1] + {8'h00,lerp_i1[63:56], 8'h00,lerp_i1[47:40], 8'h00,lerp_i1[31:24], 8'h00,lerp_i1[15:8]}; + assign lerp_texel = lerp_i2 & 64'h00ff00ff00ff00ff; + +endmodule \ No newline at end of file diff --git a/hw/rtl/tex_unit/VX_tex_define.vh b/hw/rtl/tex_unit/VX_tex_define.vh index 0286ae65..ef305c76 100644 --- a/hw/rtl/tex_unit/VX_tex_define.vh +++ b/hw/rtl/tex_unit/VX_tex_define.vh @@ -11,6 +11,9 @@ `define CLAMP(x,lo,hi) ((x < lo) ? lo : ((x > hi) ? hi : x)) +`define BLEND_FRAC_64 8 +`define LERP_64(x1,x2,frac) ((x2 + (((x1 - x2) * frac) >> `BLEND_FRAC_64)) & 64'h00ff00ff00ff00ff) + `define TEX_ADDR_BITS 32 `define TEX_FORMAT_BITS 3 `define TEX_WRAP_BITS 2 @@ -26,7 +29,7 @@ `define MAX_COLOR_WIDTH 8 `define NUM_COLOR_CHANNEL 4 -`define TEX_COLOR_BITS 32 +`define TEX_COLOR_BITS 8 `define R5G6B5 `TEX_FORMAT_BITS'h1 `define R8G8B8 `TEX_FORMAT_BITS'h2 diff --git a/hw/rtl/tex_unit/VX_tex_format.v b/hw/rtl/tex_unit/VX_tex_format.v index 9d2ddd7e..6279c6b7 100644 --- a/hw/rtl/tex_unit/VX_tex_format.v +++ b/hw/rtl/tex_unit/VX_tex_format.v @@ -1,55 +1,101 @@ `include "VX_tex_define.vh" module VX_tex_format #( - parameter CORE_ID = 0 + parameter CORE_ID = 0, + parameter NUM_TEXELS = 4 //BILINEAR ) ( - input wire [31:0] texel_data, + input wire [NUM_TEXELS-1:0][31:0] texel_data, input wire [`TEX_FORMAT_BITS-1:0] format, output wire [`NUM_COLOR_CHANNEL-1:0] color_enable, - output wire [`TEX_COLOR_BITS-1:0] R, - output wire [`TEX_COLOR_BITS-1:0] G, - output wire [`TEX_COLOR_BITS-1:0] B, - output wire [`TEX_COLOR_BITS-1:0] A + output wire [NUM_TEXELS-1:0][63:0] formatted_texel ); `UNUSED_PARAM (CORE_ID) reg [`NUM_COLOR_CHANNEL-1:0] color_enable_r; - reg [`TEX_COLOR_BITS-1:0] R_r; - reg [`TEX_COLOR_BITS-1:0] G_r; - reg [`TEX_COLOR_BITS-1:0] B_r; - reg [`TEX_COLOR_BITS-1:0] A_r; + reg [NUM_TEXELS][63:0] formatted_texel_r; always @(*) begin - case (format) - `R5G6B5: begin - R_r = `TEX_COLOR_BITS'(texel_data[15:11]); - G_r = `TEX_COLOR_BITS'(texel_data[10:5]); - B_r = `TEX_COLOR_BITS'(texel_data[4:0]); - A_r = {`TEX_COLOR_BITS{1'b0}}; - color_enable_r = 4'b1110; - end - `R8G8B8: begin - R_r = `TEX_COLOR_BITS'(texel_data[23:16]); - G_r = `TEX_COLOR_BITS'(texel_data[15:8]); - B_r = `TEX_COLOR_BITS'(texel_data[7:0]); - A_r = {`TEX_COLOR_BITS{1'b0}}; - color_enable_r = 4'b1110; - end - default: begin // `R8G8B8A8: - R_r = `TEX_COLOR_BITS'(texel_data[31:24]); - G_r = `TEX_COLOR_BITS'(texel_data[23:16]); - B_r = `TEX_COLOR_BITS'(texel_data[15:8]); - A_r = `TEX_COLOR_BITS'(texel_data[7:0]); - color_enable_r = 4'b1111; - end - endcase + for (integer i = 0; i